我在变量中分配接口名称,通过该变量,我需要调用接口,即在ChannelFactory类中只接受接口。如果我在ChannelFactory中直接将接口指定为Test,那么它工作正常。
string interfaceName = "Test";
var factory = new ChannelFactory<**interfaceName**>(new BasicHttpBinding(), new EndpointAddress(*********));
请建议可行的方法,如何从字符串变量到接口进行类型转换。
答案 0 :(得分:5)
您不能直接从字符串变量类型转换为接口。但是,您可以使用反射来创建泛型类型。
请注意,生成的工厂将是object类型,因此调用其上的所有接口方法也必须通过反射(或使用dynamic keyword)
完成以下代码将创建ChannelFactory槽反射,但正如您所看到的结果是object类型,这意味着您无法直接在其上调用通道方法。
string interfaceName = "StackOverflow.ITest";
Type f = typeof (ChannelFactory<>);
Type[] typeargs = {Type.GetType(interfaceName, true)};
Type constructed = f.MakeGenericType(typeargs);
object factory = Activator.CreateInstance(constructed);
答案 1 :(得分:1)
首先:你不能那样做! 你的代码行
var factory = new ChannelFactory<interfaceName>(new BasicHttpBinding(), new EndpointAddress(***));
可能会建议工厂(类型var
)是变体,但事实并非如此。它是一个变量,它是类型安全的,由编译器根据通用调用new ChannelFactory<interfaceName>
生成。因此,您无法在通用调用中指定变量接口。
答案 2 :(得分:1)
您不能在通用约束中将interfaceName作为字符串传递。您可以执行以下操作
string interfaceName = "Test";
Type myInterfaceType = Type.GetType(interfaceName);
var factoryType = typeof(ChannelFactory<>).MakeGenericType(myInterfaceType);
var factoryCtr = factoryType.GetConstructor(new []{ typeof(Binding), typeof(EndpointAddress)});
ChannelFactory factory = factoryCtr.Invoke(new object[]{ new BasicHttpBinding(), new EndpointAddress("")}) as ChannelFactory;
答案 3 :(得分:0)
要继续接下来Fischermaen的答案,其次,你也不能这样做!
泛型类型的类型参数列表(尖括号中的类型名称;例如,&#34; int&#34; List<int>
中的)不是变量。它们是静态编译时令牌。你不能比你想做的更多这样做了:
string className = "FileInfo";
**className** theObject = new **className**("C:\\autoexec.bat");
因为C#是静态类型语言,所以type-name标记表示的类型必须在编译时静态知道。请注意,基于反射的答案会为您提供一个引用,其静态类型是ChannelFactory<TChannel>
的子类型,非通用ChannelFactory
或object
。您不能对只在运行时知道的类型进行静态编译时引用。