用于将类的实例创建到DLL中的反射用法

时间:2010-12-01 13:12:42

标签: c# reflection

我有以下代码:

var type = typeof(PluginInterface.iMBDDXPluginInterface);
var types = AppDomain.CurrentDomain.GetAssemblies().ToList()
    .SelectMany(s => s.GetTypes())
    .Where(p => type.IsAssignableFrom(p));

Type t = types.ElementAt(0);
PluginInterface.iMBDDXPluginInterface instance = Activator.CreateInstance(t) as PluginInterface.iMBDDXPluginInterface;
TabPage tp = new TabPage();

tp = instance.pluginTabPage();

dll中的类实现了PluginInterface和上面代码中的Type,肯定是正确的类/类型,但是当我尝试通过接口创建实例时,我收到一条错误消息:

  

未分配给对象实例的对象引用。

有人知道为什么吗?

感谢。

2 个答案:

答案 0 :(得分:3)

反正

TabPage tp = new TabPage();
tp = instance.pluginTabPage();

毫无意义。

执行:

TabPage tp = instance.pluginTabPage();

下一步也是这样做的:

Type type = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(s => s.GetTypes())
    .FirstOrDefault(p => type.IsAssignableFrom(p));
if (type != null)
{
    // create instance
}

或(我的首选方式):

from asm in AppDomain.CurrentDomain.GetAssemblies()
from type in asm.GetTypes()
where !type.IsInterface && !type.IsAbstract && typeof(ITarget).IsAssignableFrom(type)
select (ITarget)Activator.CreateInstance(type);

答案 1 :(得分:1)

尝试查看反射器中的类型。也许构造函数接受您没有正确传递给Activator.CreateInstance的参数。