Calling a delegate function function

I have the following C # code:

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

And here is the IL code:

 .method public hidebysig static float64 f2 ( class [mscorlib]System.Func`2<float64, float64> 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<float64, float64>::Invoke(!0) IL_0007: ret } 

How can i emit

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

excitation through System.Reflection.Emit or better through Mono.Cecil ?

What? 1 and! 0 are stands for?

+7
source share
1 answer

The syntax !n is a reference to a common argument.

In this example ...

!0 is a reference to the first common argument Func<double, double> (used as the argument type of the Invoke method)

!1 is a reference to the second common common argument Func<double, double> (used as the return type of Invoke )

EDIT : your method uses System.Reflection.Emit ...

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

EDIT2 : fixed explanation !n after @kvb prompt

+9
source

All Articles