请考虑以下代码:
void fun1(string typeName)
{
object adap = Activator.CreateInstance(typeName);
adap.dowork(); //won't compile because of strongly typed.
}
使用Activator.CreateInstance()
我们可以轻松创建任何类型的实例,但如果我们在设计时不知道类型名称,则无法将其转换为实际类型。
我的问题是,如果我们不能将它转发到适当的类型,我们如何调用由Activator.CreateInstance
创建的实例的函数,因为我们在设计时不知道类型名称,但我们知道该函数存在。< / p>
我希望自己清楚明白。
答案 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
在这种情况下,它是一个更面向对象的解决方案。