【发布时间】:2012-02-10 20:48:31
【问题描述】:
剧情是这样的——
- 我有一个程序集说“MyAssembly”。此程序集中定义了一个接口,例如“IMyInterface”。
- 在同一个程序集中,我有一个类(MyClass),其中定义了一个方法:
public void MyMethod(IMyInterface object) { }
- 现在在我的项目中,我创建了一个与“MyAssembly”中的接口“IMyInterface”公开的名称和属性完全相同的接口。
- 我有一个扩展此接口的类(我在项目中创建的接口),我想将该类的对象作为参数传递给使用反射的不同程序集中的方法“MyMethod”。
问题是 -
- 当我尝试使用反射调用该方法时,我得到了 “无法将对象转换为 IMyInterface 类型”的异常。
代码 -
Assembly myAssembly = Assembly.LoadFrom("MyAssembly");
object classObject = myAssembly.CreateInstance("MyClass");
Type classType = myAssembly.GetType("MyClass");
MethodInfo myMethod = classType.GetMethod("MyMethod", BindingFlags.Instance);
// Creating an object of class in the latest assembly and need to pass this
// to method in assembly with different version.
ClassExtendingMyInterface obj= new ClassExtendingMyInterface ();
myMethod.Invoke(classObject, new object[] { obj});
如果我说对了,这是因为创建的对象在不同的程序集中,并且该方法期望的参数是它自己的程序集。
我想到的另一种方法是在类中创建自己的动态方法,该方法将接受我的类的对象。
我曾尝试在 Google 上搜索并通过 Reflection.Emit 或 RunSharp 来动态创建您自己的课程。但是,我们只能在动态生成的程序集中使用它,而不能在现有程序集中创建动态方法或类。
我知道在运行时生成程序集不是一个好方法。但我现在什么都想不出来。感谢您的帮助。
【问题讨论】:
标签: c# reflection assemblies reflection.emit reflector