2011-12-27 61 views
2

我在變量中分配接口名稱,通過該變量,我需要調用接口,即在ChannelFactory類中只接受接口。如果我直接在ChannelFactory中將接口指定爲Test,那麼它工作正常。通過使用變量名稱調用接口

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

請建議可能的方式,如何從字符串變量類型轉換爲接口。

回答

1

首先:你不能那樣做! 您的代碼行

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

可能表明工廠(var型)是變種,但事實並非如此。它是一個變量,它是類型安全的,由編譯器製作,由於通用調用new ChannelFactory<interfaceName>。所以你不能在泛型調用中指定一個變量接口。

5

您不能直接從字符串變量轉換爲接口。但是,您可以使用反射來創建通用類型。

注意然而,所得到的工廠將是類型的對象,所以要求它所有的接口方法也將必須完成槽反射(或使用dynamic keyword)

下面的代碼將創建的ChannelFactory槽式反射,但正如你所看到的結果是一個類型的對象,這意味着你不能直接調用就可以了通道的方法。

string interfaceName = "StackOverflow.ITest"; 

Type f = typeof (ChannelFactory<>); 
Type[] typeargs = {Type.GetType(interfaceName, true)}; 

Type constructed = f.MakeGenericType(typeargs); 
object factory = Activator.CreateInstance(constructed); 
+0

儘管通過將最後一行更改爲'var factory = Activator.CreateInstance(構造)爲ChannelFactory;'您在IDE中保留了一些基本的通道功能。 – flindeberg 2012-02-06 14:59:30

1

你不能傳遞接口名作爲通用約束字符串。你可以做下面的

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; 
0

接下來從費舍爾曼的答案,第二,你不能這樣做,要麼!

一般類型的類型參數列表(尖括號中的類型名稱;例如,在List<int>「INT」)不是變量。它們是靜態編譯時令牌。你可以不這樣做比你試圖做什麼:

string className = "FileInfo"; 
**className** theObject = new **className**("C:\\autoexec.bat"); 

因爲C#是一種靜態類型語言,類型,名稱標記表示的類型必須在編譯時靜態聞名。請注意,這裏基於反射的答案會爲您提供一個參考,其靜態類型是ChannelFactory<TChannel>的子類型,可以是非泛型ChannelFactoryobject。對於僅在運行時才知道的類型,不能有靜態編譯時引用。