在C#反射中使用IL生成器在静态字段上调用方法

时间:2016-06-22 15:20:41

标签: c# reflection ilgenerator

我从C#反射中通过Type生成新的TypeBuilder。我现在遇到的问题是如何构建方法体来调用静态域上的方法。

现在我生成的(在运行时)类看起来像这样:

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 个答案:

答案 0 :(得分:0)

所以我只使用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,因为(在我看来)并不需要。