Я просматривал статью Джоэла Побара Dodge Common Pidfall для создания скоростных приложений , посвященную Reflection, и я смотрел на определенный фрагмент кода, который не компилируется (слегка измененный, чтобы сузить конкретная ошибка, потому что в его примере было больше ошибок):
MethodInfo writeLine = typeof(Console).GetMethod("WriteLine");
RuntimeMethodHandle myMethodHandle = writeLine.MethodHandle;
DynamicMethod dm = new DynamicMethod(
"HelloWorld", // name of the method
typeof(void), // return type of the method
new Type[]{}, // argument types for the method
false); // skip JIT visibility checks
ILGenerator il = dm.GetILGenerator();
il.Emit(OpCodes.Ldstr, "Hello, world");
il.Emit(OpCodes.Call, myMethodHandle); // <-- 2 errors here
il.Emit(OpCodes.Ret);
Ошибки:
Program.cs(350,13): error CS1502: The best overloaded method match for 'System.Reflection.Emit.ILGenerator.Emit(System.Reflection.Emit.OpCode, byte)' has some invalid arguments
Program.cs(350,35): error CS1503: Argument '2': cannot convert from 'System.RuntimeMethodHandle' to 'byte'
ILGenerator
может Emit
с MethodInfo
, но, похоже, он не поддерживает MethodHandle
... кто-нибудь знает, как заставить этот образец работать?