Вызвать метод для статического поля, используя генератор 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, потому что (на мой взгляд) там не нужны.

Другие вопросы по тегам