我有一个程序集,其中包含继承自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 implements但我不知道如何解决它。
抛出的错误是
无法将“myNameSpace.RD_ToBeProcessed”类型的对象转换为“myNameSpace.ToBeProcessed”。
接受的答案表明问题是2个不同版本的基础组件。但是我在应用程序目录中使用了ILSpy和ToBeProcessed dll,以及与RD_ToBeProcessed报告在同一目录中的dll:
ToBeProcessed,Version = 1.0.4336.31676,Culture = neutral,PublicKeyToken = null
所以我不确定我做错了什么。我应该将ToBeProcessed更改为应用程序和插件中使用的接口(ItoBeProcessed)吗?然后有一个单独的程序集,它包含基本的ToBeProcessed类,根本不会被应用程序引用(只是by plugin)?
编辑:使用接口类解决了问题。我仍然不知道出了什么问题,但Kol的回答表明,理论上这应该是正确的。
答案 0 :(得分:1)
答案 1 :(得分:1)
以下解决方案编译并运行时没有错误:
程序集#1:ToBeProcessed
编译为DLL,复制到c:\project
和c:\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:ToBeProcessedTest
编译为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
答案 2 :(得分:0)
检查这个post它通过示例解释了反思。像继承的情况以及如何使用type.GetMethods (BindingFlags.LookupAll)
来获取所有方法。