2013-04-22 68 views
2

考慮下面的代碼:與Activator.CreateInstance創建的對象的工作

void fun1(string typeName) 
{ 
    object adap = Activator.CreateInstance(typeName); 
    adap.dowork(); //won't compile because of strongly typed. 
} 

使用Activator.CreateInstance(),我們可以輕鬆地創建任何類型的實例,但如果我們不知道在設計時的類型名稱,它不是可能會降低它的實際類型。

我的問題是,如果我們不能將它降爲合適的類型,我們怎麼能夠調用由Activator.CreateInstance創建的實例的函數,因爲我們在設計時不知道類型名稱,但我們知道該函數存在。

我希望我已經說清楚了。

+1

如果你不知道在編譯時的類型,你怎麼知道在它上面調用dowork()?這些類型之間是否有共同的接口? – 2013-04-22 17:51:46

+0

通常這是通過接口完成的。你有一個抽象接口(作爲一個「合同」,不應該改變那麼多),你依賴於那個接口,但不是一個特定的實現。然後您可以通過界面獲得實現的成員。 – 2013-04-22 17:59:24

+0

是的,你是完全正確的,這通常是通過接口或繼承來完成的,但我不能在我的情況下使用它們,因爲我不是創建其對象需要創建的「類型」的人。 – 2013-04-22 18:04:56

回答

6

你可以做的一件事是將它分配到dynamic類型。

dynamic adap = Activator.CreateInstance(typeName); 
adap.dowork(); //this now compiles 

如果您知道方法名稱,還可以使用反射動態調用方法。

3

最好的選擇是知道一些常見的接口或基類,並將其轉換爲該類型。但是,如果這是不可能的,你可以使用鴨型

dynamic adap = ... 

而你的其他代碼是。

如果這是不可能的(錯誤.net版本等),那麼你將不得不使用反射。

1

如果你知道typeName有方法doWork,這將是更好的,你的類型實現類似的接口:

interface IDoWorkSupport 
{ 
    void DorWork(); 
} 

那麼你可以讓你的代碼,如:

var adap = (IDoWorkSupport) Activator.CreateInstance(typeName); 
adap.DoWork(); //this now compiles 

在這情況下它更加面向對象的解決方案。

相關問題