C# · 12月 27, 2021

c# – 如何正确地投射通过反射创建的对象

我试图围绕着反思,我决定添加插件功能到我正在写的程序.了解一个概念的唯一方法是让你的手指变脏并编写代码,所以我去了创建一个简单的接口库,包括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 intendedIPlugin i = (IPlugin) oh.Unwrap();i.DoStuff();

这是我的问题:

> Activator.CreateInstance(Type t)返回一个对象,但是我无法将对象转换为该对象实现的接口.为什么?
>应该使用不同的CreateInstance()重载吗?
>什么是反思相关的提示和技巧?
>有没有一些重要的反思,我只是没有得到?

解决方法 我只是猜测在这里,因为从你的代码,你不明白你在哪里定义了IPlugin接口,但如果你不能投放在你的主机应用程序,那么你可能在主机程序集中有IPlugin接口,然后在同一时间你的插件程序集这不行.

最简单的事情是让这个工作是在你的主机程序集中将IPlugin接口标记为public,然后让你的插件程序集引用主机应用程序程序集,这样两个程序集都可以访问相同的界面.