public object GetWcfInstance<T>(string endPointName)
{
ChannelFactory<T> channelFactory = new ChannelFactory<T>(endPointName);
return channelFactory.CreateChannel();
}其中ChannelFactory是第三方的库。如果使用时:
GetWcfInstance<IMyService>("Hello"); 可以成功。但是有个问题就是,如果服务多的话就要在代码中不断的加。我现在想实现类似:
Type t = typeof(IMyService); //Type可以通过配置文件等来获取,这样就方便了。但是: IMyService 转 Type t容易,可要由T转IMyService我却没办法,有谁知道的请指教。如果可以,我就能实现类似如下重载:public object GetWcfInstance(Type t, string endPointName)
{
//。
//ChannelFactory<T> channelFactory = new ChannelFactory<T>(endPointName);
//return channelFactory.CreateChannel();
}
{
ChannelFactory<T> channelFactory = new ChannelFactory<T>(endPointName);
return channelFactory.CreateChannel();
}其中ChannelFactory是第三方的库。如果使用时:
GetWcfInstance<IMyService>("Hello"); 可以成功。但是有个问题就是,如果服务多的话就要在代码中不断的加。我现在想实现类似:
Type t = typeof(IMyService); //Type可以通过配置文件等来获取,这样就方便了。但是: IMyService 转 Type t容易,可要由T转IMyService我却没办法,有谁知道的请指教。如果可以,我就能实现类似如下重载:public object GetWcfInstance(Type t, string endPointName)
{
//。
//ChannelFactory<T> channelFactory = new ChannelFactory<T>(endPointName);
//return channelFactory.CreateChannel();
}
从GetWcfInstance<T>(string endPointName)方法是不能下手了,可以在库中找到每个类型的详细定义,绕开他的这个工厂,用每个类来反射建立就可以了每个详细的类定义是基础,而工厂模式只是建立在这些基础之上的具体应用, 意思就是说,你使用那些底层的/基础的详细类定义,自己写一套反射创建类实例的工厂,替代它那个貌似泛型又返回object的工厂
大家不要被这个函数的错误设计,而忘记本贴的主要目的。
本帖的主要目的,是如何在非泛型中使用泛的问题。
public T GetWcfInstance<T>(...
固然正正确,说真我们暂且别去考虑其返回值的问题。
之所GetWcfInstance<T>要定义成泛型,是因为其内部ChannelFactory<T> 泛型。1:本帖想要解决的问题是非泛型函数对泛型的应用。
即:GetWcfInstance(Type t),中如何来实现对ChannelFactory<T>的合法构造。
即解决“Type t = typeof(T);”的逆过程。2:至于有人提出“T转IMyService的合法”性,并非本帖讨论的重点,因为这在很多IOC中并不进行显示控制。
Type t=typeof(T);
if (t.GetInterface(T) != null)
{
//t is typeof T
break;
}