0

我有一个包含继承自 ToBeProcessed 的类 RD_ToBeProcessed 的程序集。这些类位于单独的程序集中。

我使用 createInstance 加载一个对象,然后尝试使用以下代码对其进行转换:

    private Type tbpType = null;
    public ToBeProcessed getToBeProcessedObject(string data)
    {
        // The data is passed in so that the fields are populated with the
        // correct data.
        if (tbpType==null){
            Assembly assembly = 
                Assembly.LoadFrom("c:\\project\\RD_ToBeProcessed.dll");
            tbpType = assembly.GetType("myNameSpace.RD_ToBeProcessed");
        }
        Object tbp = Activator.CreateInstance(tbpType,data);
                    // This line throws an error
        return (ToBeProcessed)tbp;
    }

这是问题的重复 .NET: Unable to cast object to interface it implement but I don't know how to resolve it。

抛出的错误是

无法将“myNameSpace.RD_ToBeProcessed”类型的对象转换为“myNameSpace.ToBeProcessed”类型。

接受的答案表明问题是基础组件的 2 个不同版本。但我使用了 ILSpy 和应用程序目录中的 ToBeProcessed dll,以及与 RD_ToBeProcessed 报告位于同一目录中的一个:

待处理,版本=1.0.4336.31676,文化=中性,PublicKeyToken=null

所以我不确定我做错了什么。我应该将 ToBeProcessed 更改为应用程序和插件中使用的接口(ItoBeProcessed)吗?然后有一个单独的程序集来保存基础 ToBeProcessed 类,该类根本不会被应用程序引用(只是 by 插件)?

编辑:通过使用接口类解决了这个问题。我仍然不知道出了什么问题,但 Kol 的回答表明,理论上这应该可以正常工作。

4

3 回答 3

1

之前有人问过这个问题,在 stackoverflow How to get a Static property with Reflection中查看了这个问题

于 2011-11-15T10:41:04.303 回答
1

以下解决方案编译并运行没有错误:

装配#1:待处理

编译成 DLL,然后复制c:\projectc:\project\test. 指 System.dll。ToBeProcessed.cs:

using System;
using System.Reflection;

[assembly: AssemblyVersion("1.0.*")]

namespace myNameSpace
{
  public class ToBeProcessed
  {
    protected string data;
    public ToBeProcessed() { }
    public string Process() { return data.ToUpper(); }
  }
}

程序集 #2:RD_ToBeProcessed

编译为 DLL,然后复制到c:\project. 指 System.dll 和 ToBeProcessed.dll。RD_ToBeProcessed.cs:

using System;
using System.Reflection;

[assembly: AssemblyVersion("1.0.*")]

namespace myNameSpace
{
  public class RD_ToBeProcessed : ToBeProcessed
  {
    public RD_ToBeProcessed(string data) { this.data = data; }
  }
}

程序集#3:待处理测试

编译成 EXE,复制到c:\project\test. 指 System.dll 和 ToBeProcessed.dll。ToBeProcessedTest.cs:

using System;
using System.Reflection;

[assembly: AssemblyVersion("1.0.*")]

namespace myNameSpace
{
  class ToBeProcessedTest
  {
    private Type tbpType = null;
    public ToBeProcessed getToBeProcessedObject(string data)
    {
      if (tbpType == null)
      {
        Assembly assembly = Assembly.LoadFrom("c:\\project\\RD_ToBeProcessed.dll");
        tbpType = assembly.GetType("myNameSpace.RD_ToBeProcessed");
      }
      Object tbp = Activator.CreateInstance(tbpType, data);
      return (ToBeProcessed)tbp;
    }

    public static void Main()
    {
      ToBeProcessedTest test = new ToBeProcessedTest();
      ToBeProcessed tbp1 = test.getToBeProcessedObject("myData1");
      Console.WriteLine(tbp1.Process());
      ToBeProcessed tbp2 = test.getToBeProcessedObject("myData2");
      Console.WriteLine(tbp2.Process());
      Console.ReadKey(true);
    }
  }
}

输出:

MYDATA1
MYDATA2
于 2011-11-15T12:04:30.187 回答
0

查看这篇文章,它通过示例解释了反射。像继承的情况以及如何使用type.GetMethods (BindingFlags.LookupAll) 来获取所有方法。

于 2011-11-15T10:42:12.247 回答