使用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创建的实例的函数向下转换为适当的类型,因为我们在设计时不知道类型名,但我们知道函数存在,那么我们如何调用它呢?

我希望我已经说清楚了。

您可以将其指定为dynamic类型。

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

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

最好的选择是知道一些通用的接口或基类,并将其转换为它们。但是,如果不可能,您可以使用

进行duck-type。
dynamic adap = ...

和其余的代码保持原样。

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

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

interface IDoWorkSupport
{
    void DorWork();
}

,你可以让你的代码像:

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

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

相关内容

  • 没有找到相关文章