簡體   English   中英

使用Activator.CreateInstance創建的對象

[英]Working with objects created with Activator.CreateInstance

請考慮以下代碼:

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

使用Activator.CreateInstance()我們可以輕松創建任何類型的實例,但如果我們在設計時不知道typename,則無法將其轉換為實際類型。

我的問題是,如果我們不能將它轉發到適當的類型,我們如何調用Activator.CreateInstance創建的實例的函數,因為我們在設計時不知道typename,但我們知道該函數存在。

我希望我已經說清楚了。

您可以做的一件事是將其分配給dynamic類型。

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

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

最好的選擇是知道一些常見的接口或基類,並轉換為。 但是,如果不可能,您可以使用鴨子類型

dynamic adap = ...

而你的其余代碼就是這樣。

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

如果您知道typeName具有doWork方法,那么您的類型實現如下界面會更好:

interface IDoWorkSupport
{
    void DorWork();
}

然后你可以使你的代碼像:

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

在這種情況下,它是一個更面向對象的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM