2

考虑下面的代码:

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

使用Activator.CreateInstance()我们可以轻松地创建任何类型的实例,但是如果我们在设计时不知道类型名,那么也不可能将其向下转换为它的实际类型。

我的问题是,如果我们不能将它向下转换为适当的类型,我们如何调用创建的实例函数,Activator.CreateInstance因为我们在设计时不知道类型名,但我们知道该函数存在。

我希望我已经说清楚了。

4

3 回答 3

6

您可以做的一件事是将其分配给一个dynamic类型。

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

如果您知道方法名称,也可以使用反射动态调用方法。

于 2013-04-22T17:51:47.640 回答
3

最好的选择是了解一些常见的接口或基类,然后转换为那个。但是,如果这不可能,您可以使用

dynamic adap = ...

其余代码按原样。

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

于 2013-04-22T17:51:36.547 回答
1

如果您知道它typeName有方法doWork,那么您的类型最好实现如下接口:

interface IDoWorkSupport
{
    void DorWork();
}

然后你可以让你的代码像:

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

在这种情况下,它是一个更加面向对象的解决方案。

于 2013-08-21T06:58:26.483 回答