加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 03:51:25 所属栏目:百科 来源:网络整理
导读:我试图围绕着反思,我决定添加插件功能到我正在写的程序.了解一个概念的唯一方法是让你的手指变脏并编写代码,所以我去了创建一个简单的接口库,包括IPlugin和IHost接口,实现IPlugin的类的插件实现库和一个简单的控制台项目,实例化了使用插件对象简单工作的IHos
我试图围绕着反思,我决定添加插件功能到我正在写的程序.了解一个概念的唯一方法是让你的手指变脏并编写代码,所以我去了创建一个简单的接口库,包括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()重载吗?
>什么是反思相关的提示和技巧?
>有没有一些重要的反思,我只是没有得到?

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读