使用变量名称调用接口

时间:2011-12-27 14:04:56

标签: c# wcf interface

我在变量中分配接口名称,通过该变量,我需要调用接口,即在ChannelFactory类中只接受接口。如果我在ChannelFactory中直接将接口指定为Test,那么它工作正常。

 string interfaceName = "Test";
 var factory = new ChannelFactory<**interfaceName**>(new BasicHttpBinding(), new EndpointAddress(*********));

请建议可行的方法,如何从字符串变量到接口进行类型转换。

4 个答案:

答案 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>的子类型,非通用ChannelFactoryobject。您不能对只在运行时知道的类型进行静态编译时引用。