【发布时间】:2008-08-28 02:50:55
【问题描述】:
我正试图将我的头放在反射上,所以我决定将插件功能添加到我正在编写的程序中。理解一个概念的唯一方法就是动手编写代码,所以我创建了一个由 IPlugin 和 IHost 接口组成的简单接口库,一个实现 IPlugin 的类的插件实现库,以及一个简单的实例化 IHost 实现类的控制台项目,该类对插件对象进行简单的工作。
使用反射,我想遍历插件实现 dll 中包含的类型并创建类型的实例。我能够使用此代码成功实例化类,但我无法将创建的对象强制转换为接口。
我尝试了这段代码,但无法按预期转换对象 o。我使用调试器逐步完成了该过程,并调用了正确的构造函数。 Quickwatching 对象 o 向我展示了它具有我希望在实现类中看到的字段和属性。
loop through assemblies
loop through types in assembly
// Filter out unwanted types
if (!type.IsClass || type.IsNotPublic || type.IsAbstract )
continue;
// This successfully created the right object
object o = Activator.CreateInstance(type);
// This threw an Invalid Cast Exception or returned null for an "as" cast
// even though the object implemented IPlugin
IPlugin i = (IPlugin) o;
我使代码与它一起工作。
using System.Runtime.Remoting;
ObjectHandle oh = Activator.CreateInstance(assembly.FullName, type.FullName);
// This worked as I intended
IPlugin i = (IPlugin) oh.Unwrap();
i.DoStuff();
这是我的问题:
- Activator.CreateInstance(Type t) 返回一个对象,但我无法将该对象转换为该对象实现的接口。为什么?
- 我应该一直使用不同的 CreateInstance() 重载吗?
- 反射相关的技巧和窍门有哪些?
- 是否有一些我没有得到的反射的关键部分?
【问题讨论】:
标签: c# .net reflection