Call a dynamically generated method on a ILGenerator on the same type
通常,当我想在另一个ILGenerator对象中调用一个动态方法,该对象在同一类型上编写一个方法时,我会执行以下操作:
1 2 3 | 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. |
但是,我面临以下问题:我不能引用我要调用的方法的methodbuilder,因为它是由另一个框架生成的(我只获得对当前typebuilder的引用)。此方法在当前动态类型的基类中定义为Protected Virtual(并在我无法获取引用的MethodBuilder上重写),我可以通过执行以下操作获取对它的引用:
1 2 3 | generator.Emit(OpCodes.Ldarg_0); // reference to the current object generator.Emit(OpCodes.Ldstr,"someArgument"); generator.Emit(OpCodes.Call, baseType.GetMethod("SomeMethodDefinedInBaseClassThatWasOverridenInThisDynamicType")); |
问题是,这会调用基类型上的方法,而不是重写方法。
我有没有办法只引用定义它的typebuilder来获取对methodbuilder的引用?或者,是否有一种方法可以使用ILGenerator调用方法,而不必将"MethodInfo"对象传递给它?
我不确定是否遵循,但您需要使用opcodes.callvirt调用虚拟方法。它将自动调用重写的方法。