使用Activator.CreateInstance创建的对象

时间:2013-04-22 17:48:28

标签: c# reflection

请考虑以下代码:

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

使用Activator.CreateInstance()我们可以轻松创建任何类型的实例,但如果我们在设计时不知道类型名称,则无法将其转换为实际类型。

我的问题是,如果我们不能将它转发到适当的类型,我们如何调用由Activator.CreateInstance创建的实例的函数,因为我们在设计时不知道类型名称,但我们知道该函数存在。< / p>

我希望自己清楚明白。

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:3)

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

进行鸭子打字
dynamic adap = ...

你的代码的其余部分就是。

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

答案 2 :(得分:1)

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

interface IDoWorkSupport
{
    void DorWork();
}

然后你可以使你的代码如下:

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

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