C# ILGenerator:创建负载的方法

C# ILGenerator:创建负载的方法,c#,.net,delegates,reflection.emit,intermediate-language,C#,.net,Delegates,Reflection.emit,Intermediate Language,我正在使用System.Reflection.Emit,在某个时候我想从MethodBuilder创建一个委托: MethodBuilder fooBuilder = createFooMethodBuilder(); ILGenerator ilGenerator = ... Type delegateType = typeof(DelegateType); LocalBuilder delegateVar = ilGenerator.DeclareLocal(delegateType); /

我正在使用System.Reflection.Emit,在某个时候我想从MethodBuilder创建一个委托:

MethodBuilder fooBuilder = createFooMethodBuilder();
ILGenerator ilGenerator = ...
Type delegateType = typeof(DelegateType);
LocalBuilder delegateVar = ilGenerator.DeclareLocal(delegateType);
//Somehow create emit instructions to create delegate from fooBuilder
//Store delegate in delegateVar using 
我可以发现,要从静态函数创建委托,可以使用如下方法:

ldnull 
ldftn void class Test.MainClass::bar()
newobj instance void class Test.DelegateType::'.ctor'(object, native int)
但现在我被卡住了。我需要一种方法来ldftn MethodBuilder,然后我需要一种方法来发出下面一行的指令。我不知道如何得到一个接受本机int的构造函数


有什么建议吗?A
native int
是C#中的
IntPtr

您可以使用
type.GetConstructor
获取代理类型的
ConstructorInfo

var constructorInfo =
    delegateType.GetConstructor(new Type[] { typeof(object), typeof(IntPtr) });
然后您可以像这样发出IL指令:

il.Emit(OpCodes.Ldnull);
il.Emit(OpCodes.Ldftn, someMethodInfo);
il.Emit(OpCodes.Newobj, constructorInfo);

ILGenerator类有一个采用methodinfo的Emit重载,因此您可以执行类似于
ILGenerator.Emit(Opcodes.ldftn,mi)
的操作,其中
mi
是您要调用的方法。它可以是使用反射API找到的任何方法,甚至可以是使用MethodBuilder创建的另一个方法(它源自
MethodInfo


类似地,要调用构造函数,您将发出一条newobj指令,为目标重载提供构造函数信息。

有趣的问题。如果您没有得到解决方案,您可以发出一个对的调用。