我试图围绕着反思,我决定添加插件功能到我正在写的程序.了解一个概念的唯一方法是让你的手指变脏并编写代码,所以我去了创建一个简单的接口库,包括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()重载吗?
>什么是反思相关的提示和技巧?
>有没有一些重要的反思,我只是没有得到?