Вызвать метод для статического поля, используя генератор IL в отражении C#
Я создаю новый Type
с помощью TypeBuilder
из C# отражения. Проблема, которая у меня есть сейчас, заключается в том, как создать тело метода для вызова метода в статическом поле.
Прямо сейчас мой сгенерированный (во время выполнения) класс выглядит так:
public class Generated
{
static private MyObject obj;
public MyResponse Hello(MyRequest req1)
{
return obj.Hello(req1); // this part need to be grnerated
}
}
Итак, сейчас я генерирую метод, как это:
MethodBuilder mb = tb.DefineMethod(
methodInfo.Name,
MethodAttributes.Public | MethodAttributes.Final,
CallingConventions.HasThis | CallingConventions.ExplicitThis,
methodInfo.ReturnType,
arguments);
ILGenerator il = mb.GetILGenerator();
il.Emit(OpCodes.Ldnull); // right now I'm just simply returning null
il.Emit(OpCodes.Ret);
Поэтому, пожалуйста, скажите мне, как я могу загрузить статическое поле в стек в генераторе Il и затем вызвать определенный метод для него.
1 ответ
Решение
Так что я просто использовал ildasm.exe
декомпилировать класс, который я разместил в моем вопросе. Если кому-то понадобится персонал, похожий на мой, ниже у вас есть код Il:
IL_0000: nop
IL_0001: ldsfld class ConsoleApplication1.IMyInterface ConsoleApplication1.Controller::obj
IL_0006: ldarg.1
IL_0007: callvirt instance class ConsoleApplication1.MyResponse ConsoleApplication1.IMyInterface::Hello(class ConsoleApplication1.MyRequest)
IL_000c: stloc.0
IL_000d: br.s IL_000f
IL_000f: ldloc.0
IL_0010: ret
Также в моем коде я удалил строки IL_0000,c,d,f
, потому что (на мой взгляд) там не нужны.