我正在使用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的构造函数。
有什么建议吗?
发布于 2010-12-06 08:26:08
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);发布于 2010-12-06 08:49:21
ILGenerator类有一个接受method is的Emit重载,因此您可以执行类似ilGenerator.Emit(Opcodes.ldftn, mi)的操作,其中mi是您想要调用的方法。它可以是您使用反射API找到的任何方法,甚至可以是您使用MethodBuilder (它派生自MethodInfo)创建的另一个方法。
类似地,要调用构造函数,您需要发出一条newobj指令,为目标重载提供一个ConstructorInfo。
https://stackoverflow.com/questions/4362167
复制相似问题