我现在有一个类,同时继承了一个类和一个接口,比如
public SomeClass : Form, IAddin但是当我用反射的时候,首先我用typeof(IAddin).IsAssignableFrom(t),会返回false,
这里t就是我反射时取到的Type,我只能用GetInterface方法来解决这个问题接着,我用(IAddin)Activator.CreateInstance(t)却告诉我Invalid Cast,我实在不明白
是什么原因,请指教!!

解决方案 »

  1.   

    用(IAddin)Activator.CreateInstance(t)这种方法
    把t换为t.FullName试试
      

  2.   

    怎么转?t.FullName的类型是string,要求的参数是Type类型
      

  3.   

    Activator.CreateInstance(t)得到是SomeClass类型的一个实例,成员值也都正确,就是不能cast to IAddin
      

  4.   

    (IAddin)强制类型转换无效  
    请问接口有实例吗?
      

  5.   

    你指什么实例?Activator.CreateInstance(t)已经生成了一个SomeClass实例
      

  6.   

    我现在有一个类,同时继承了一个类和一个接口,比如 
    public SomeClass : Form, IAddin 但是当我用反射的时候,首先我用typeof(IAddin).IsAssignableFrom(t),会返回false, 
    这里t就是我反射时取到的Type,我只能用GetInterface方法来解决这个问题 
    -----------------------------------------------------------------
    t 没有实现 IAddin 接口接着,我用(IAddin)Activator.CreateInstance(t)却告诉我Invalid Cast,我实在不明白 
    是什么原因,请指教!!
    -----------------------------------------------------------------
    因为 t 没有实现 IAddin 接口,因此实例化的对象无法做类型转换
      

  7.   

    在那个类中我该实现的接口的属性和方法我都实现了啊,不明白怎么才算实现接口?
    我能GetInterface("IAddin ")至少说明我继承了接口
      

  8.   

    t 是 SomeClass?此外建议你做以下测试
    1. 判断 t 是否是一个空引用 (null)
    2. Console.WriteLine(t.FullName)
      

  9.   

    估计IAddin接口有两个,重名了,编译器理解的IAddin不是你期望的那个IAddin
      

  10.   

    肯定不为空,并且Activator.CreateInstance(t)已经生成了一个SomeClass实例,里面的属性都正确赋值,肯定只有一个IAddin接口
      

  11.   

    可能是因为你本机的运行环境中没有IAddin这个类型或者这个类型版本不一致导致了不能被强制转换。对于你的实际运行环境这个类只能被当成“Object”来处理,所以你只能通过GetMethod等方式来获取方法信息并使用Invoke来调用方法而不能被强制使用。
      

  12.   

    肯定只有一个IAddin接口,你确信?那样的话,本题无解
    1、从global开始写,写全NameSpace
    2、确认没有版本问题,版本不同的两个IAddon也会被认为是两个不同的IAddon(或者将引用部分的特定版本置为false)
      

  13.   

    string iUIFrameworkService = typeof(IUIFrameworkService).FullName;System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom(filePath);foreach (Type type in asm.GetTypes())
    {
       if (type.IsClass && type.IsPublic && !type.IsAbstract && type.GetInterface(iUIFrameworkService) != null)
       {
          ui = (IUIFrameworkService)asm.CreateInstance(type.FullName);
          if (null != ui)
          {
          }
          break;
       }
    }这种加载肯定是可以的,不知道你怎么用的。
    参考一下吧
      

  14.   

    IAddin这个接口类是自己写的,肯定是存在的。我把项目放到其他人的机器上去也是一样结果。
    再放几个目前测试的情况:
    1、先不考虑反射,SomeClass sc = new SomeClass(); IAddin isc = (IAddin)sc; 这样写结果都正确,说明SomeClass是能够正确cast到接口的。
    2、在反射中,如果这样写(Form)Activator.CreateInstance(t)是可以正确cast的,毕竟SomeClass是继承了Form类
      

  15.   

    我的代码框架基本是基于CLR via C#那本书上的,和dougua的是差不多的实在是郁闷啊
      

  16.   

    vwxyzh 说的也有道理
    如果你在两个工程里分别都定义了 IAddin 接口,就算方法什么都一模一样都不行。
    必须在一个中间的工程中定义公共的接口。
      

  17.   

    就是要保证使用和实现 IAddin 接口的地方都是引用了同一个工程 (Project) 的接口定义
      

  18.   

    xming076 说的对接口定义必须在公共工程中。还有如果被反射的dll和你的exe不在同一目录下要进行程序部署。
    CLR via C#那本书上有写。
      

  19.   

    建议用Type.AssemblyQualifiedName查看一下,看看接口的值和你的SomeClass中实现的那个接口的值
      

  20.   

    用hbxtlhx的吧,我也遇到过此问题,Invoke来call------
     可能是因为你本机的运行环境中没有IAddin这个类型或者这个类型版本不一致导致了不能被强制转换。 对于你的实际运行环境这个类只能被当成“Object”来处理,所以你只能通过GetMethod等方式来获取方法信息并使用Invoke来调用方法而不能被强制使用。
    ------
      

  21.   

    啊!dougua说的对,我把dll和程序位于统一目录时,结果就正常了,太谢谢了,至少这个问题解决了。
    第一次做这样的东西,经验不足,也没看仔细。
    现在的问题就是我怎么做一个registration/discovery mechanism?要把我的程序做成强命名吗?
    有什么资料可以看?
    欢迎大家继续帮助我。不管怎样,我下班之前结贴。^_^
      

  22.   

    好像只能用户选择插件的时候,把这些插件都copy到程序所在的目录中,比如可以放在interface子目录里面,好像一般都这么做吧