gpt4 book ai didi

c# - 发出委托(delegate)函数调用

转载 作者:太空狗 更新时间:2023-10-29 18:27:30 24 4
gpt4 key购买 nike

我有以下 C# 代码:

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

这是 IL 代码:

.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
}

我怎样才能发出

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

通过 System.Reflection.Emit 或通过 Mono.Cecil 进行说明?

!1 和 !0 代表什么?

最佳答案

!n语法是对通用参数的引用。

在这个例子中...

!0是对 Func<double, double> 的第一个通用参数的引用(用作 Invoke 方法的参数类型)

!1是对 Func<double, double> 的第二个通用通用参数的引用(用作 Invoke 的返回类型)

编辑:您的方法使用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:更正了 !n @kvb 提示后的解释

关于c# - 发出委托(delegate)函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12808673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com