lui*_*bal 3 .net c# delegates reflection.emit intermediate-language
我正在使用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
Run Code Online (Sandbox Code Playgroud)
我可以发现从静态函数创建委托使用这样的东西:
ldnull
ldftn void class Test.MainClass::bar()
newobj instance void class Test.DelegateType::'.ctor'(object, native int)
Run Code Online (Sandbox Code Playgroud)
但是现在我被卡住了.我需要一种方法来修改MethodBuilder然后我需要一种方法来发出以下行的指令.我不知道如何获得一个接受原生int的构造函数.
有什么建议?
A native int是IntPtrC#中的一个.
您可以使用以下命令获取ConstructorInfo委托类型Type.GetConstructor:
var constructorInfo =
delegateType.GetConstructor(new Type[] { typeof(object), typeof(IntPtr) });
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样发出IL指令:
il.Emit(OpCodes.Ldnull);
il.Emit(OpCodes.Ldftn, someMethodInfo);
il.Emit(OpCodes.Newobj, constructorInfo);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
849 次 |
| 最近记录: |