在 C# 反射中使用 ID 生成器在静态字段上调用方法
Invoke method on static filed using IL generator in C# reflection
我正在通过 TypeBuilder
从 C# 反射生成一个新的 Type
。我现在遇到的问题是如何构建方法体以在静态字段上调用方法。
现在我生成的(在运行时)class 看起来像这样:
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 生成器的堆栈上加载静态字段,然后在其上调用某些方法。
所以我只是使用 ildasm.exe
反编译了我在问题中发布的 class。如果有人需要做类似于我的工作人员,下面有 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
,因为(在我看来)没有必要。
我正在通过 TypeBuilder
从 C# 反射生成一个新的 Type
。我现在遇到的问题是如何构建方法体以在静态字段上调用方法。
现在我生成的(在运行时)class 看起来像这样:
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 生成器的堆栈上加载静态字段,然后在其上调用某些方法。
所以我只是使用 ildasm.exe
反编译了我在问题中发布的 class。如果有人需要做类似于我的工作人员,下面有 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
,因为(在我看来)没有必要。