我正试图围绕反射来思考,所以我决定将插件功能添加到我正在编写的程序中。理解一个概念的唯一方法就是动手编写代码,所以我创建了一个由 IPlugin 和 IHost 接口组成的简单接口库,一个实现 IPlugin 的类的插件实现库,以及一个简单的实例化 IHost 实现类的控制台项目,该类对插件对象进行简单的工作。
使用反射,我想遍历我的插件实现 dll 中包含的类型并创建类型的实例。我能够使用此代码成功实例化类,但我无法将创建的对象强制转换为接口。
我尝试了这段代码,但我无法按预期投射 object 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() 重载吗?
- 反射相关的提示和技巧是什么?
- 是否有一些我没有得到的反思的关键部分?