2010-05-08 3 views
0

Обычно, когда я хочу, чтобы вызвать динамический метод в другом ILGenerator объекте, написание метода на тот же тип я следующее:Вызов динамически сгенерированный метод на 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). Этот метод определен как защищенный виртуальный (и перекрываться на MethodBuilder я не могу получить ссылку) в базовом классе текущего динамического типа, и я могу получить ссылку на него, делая это:

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

Не уверен, что я следую, но вам нужно использовать Opcodes.CallVirt для вызова виртуальных методов. Который должен автоматически вызывать переопределенный метод.

+0

Работал, спасибо. –