Emissione chiamata funzione delegato

Ho il seguente codice C #:

public static double f2(Func f, double x) { return f(x); } 

E qui è il codice IL:

 .method public hidebysig static float64 f2 ( class [mscorlib]System.Func`2 f, float64 x ) cil managed { // Method begins at RVA 0x20bd // Code size 8 (0x8) .maxstack 8 IL_0000: ldarg.0 IL_0001: ldarg.1 IL_0002: callvirt instance !1 class [mscorlib]System.Func`2::Invoke(!0) IL_0007: ret } 

Come posso emettere

 callvirt instance !1 class [mscorlib]System.Func`2::Invoke(!0) 

insturction attraverso il System.Reflection.Emit o meglio attraverso il Mono.Cecil ?

Cosa! 1 e! 0 sono sinonimo di?

La syntax !n è un riferimento a un argomento generico.

In questo esempio …

!0 è un riferimento al primo argomento generico di Func (utilizzato come tipo dell’argomento del metodo Invoke )

!1 è un riferimento al secondo argomento generico generico di Func (utilizzato come tipo di ritorno di Invoke )

EDIT : il tuo metodo usando System.Reflection.Emit

 var dynamicMethod = new DynamicMethod( "f2Dynamic", typeof(double), new Type[] { typeof(Func), typeof(double) }); var il = dynamicMethod.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Callvirt, typeof(Func).GetMethod("Invoke")); il.Emit(OpCodes.Ret); var f2Dynamic = (Func, double, double>)dynamicMethod.CreateDelegate( typeof(Func, double, double>)); Console.WriteLine(f2(x => x * x, 10.0)); // prints 100 Console.WriteLine(f2Dynamic(x => x * x, 10.0)); // prints 100 

EDIT2 : corretta la spiegazione !n dopo un suggerimento di @kvb