通常,当我想在另一个在同一类型上编写方法的ILGenerator对象中调用动态方法时,我会执行以下操作:
generator.Emit(OpCodes.Ldarg_0); // reference to the current object
generator.Emit(OpCodes.Ldstr, "someArgument");
generator.Emit(OpCodes.Call, methodBuilder); //this methodbuilder is also defined on this dynamic type.
但是,我遇到了以下问题:我无法引用我想调用的方法的方法构建器,因为它是由另一个框架生成的(我只获得对当前TypeBuilder的引用)。在当前动态类型的基类中,此方法被定义为受保护的虚拟(并在方法构建器上覆盖,我无法获取引用),我可以通过执行以下操作获得对它的引用:
generator.Emit(OpCodes.Ldarg_0); // reference to the current object
generator.Emit(OpCodes.Ldstr, "someArgument");
generator.Emit(OpCodes.Call, baseType.GetMethod("SomeMethodDefinedInBaseClassThatWasOverridenInThisDynamicType"));
问题是这会调用基类型的方法,而不是重写方法。
有什么方法可以获得对方法构建器的引用,只引用定义它的类型构建器?或者有没有办法使用ILGenerator调用方法而不必将'MethodInfo'对象传递给它?
答案 0 :(得分:0)
我不确定是否遵循,但您需要使用Opcodes.CallVirt来调用虚拟方法。哪个应该自动调用重写的方法。