考虑以下代码:
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
在这种情况下,它是一个更面向对象的解决方案。