【问题标题】:Reflection usage for creating instance of a class into DLL将类的实例创建到 DLL 中的反射用法
【发布时间】:2010-12-01 13:12:42
【问题描述】:

我有以下代码:

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,绝对是正确的类/类型,但是当我尝试通过接口创建实例时,我收到一条错误消息:

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

有人知道为什么吗?

谢谢。

【问题讨论】:

  • 你在哪一行得到这个异常?
  • 我在调用 instance.pluginTabPage 方法时得到它。
  • 您需要更好的错误消息 - 将您的 Activator.CreateInstance(t) as Plugin... 更改为 (Plugin...) Activator.CreateInstance(t)
  • 现在已修复....这是我的 dll 类的错误。谢谢。

标签: c# reflection


【解决方案1】:

不管怎样

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);

【讨论】:

  • 感谢您的建议。已修复初始错误 - 是我的 dll 类的问题。
【解决方案2】:

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

【讨论】:

  • 这也是我的第一个想法,但如果是这种情况,不会抛出MissingMethodException 吗? msdn.microsoft.com/en-us/library/wccyzw83.aspx
  • 该类没有参数,它只是有一个默认构造函数什么都不带?
  • 好吧,我的意思是它可能有更多的ctors,而没有args的可能忘记设置一个关键变量,从而导致异常。
猜你喜欢
  • 2011-09-12
  • 2016-04-16
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
相关资源
最近更新 更多