其他分享
首页 > 其他分享> > 从MethodInfo获取Func <>的Delegate.CreateDelegate对双精度类型不起作用?

从MethodInfo获取Func <>的Delegate.CreateDelegate对双精度类型不起作用?

作者:互联网

我正在尝试使用为double.CompareTo创建功能.

我创建它是这样的:

       var method = typeof(double).GetMethod("CompareTo", new Type[] { typeof(double) });

       var func = (Func<double, double, int>)Delegate.CreateDelegate(typeof(Func<double, double, int>), method);

它适用于string.CompareTo像这样:

       var method = typeof(string).GetMethod("CompareTo", new Type[] { typeof(string) });

       var func = (Func<string, string, int>)Delegate.CreateDelegate(typeof(Func<string, string, int>), method);

我收到一个Argument异常,说“由于目标方法的签名或安全透明性与委托类型不兼容,因此无法绑定目标方法”(自由翻译自瑞典语)

怎么了?

解决方法:

IIRC的“扩展参数并将第一个视为目标”技巧仅适用于引用类型,例如字符串-大概是因为此实例方法调用成为具有第一个参数地址的静态调用,而不是简单地加载两个参数.您可以通过以下方法来破解它-不是很优雅-

var dm = new DynamicMethod(nameof(double.CompareTo), typeof(int),
     new[] { typeof(double), typeof(double) });
var il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarga_S, 0);  // load "ref arg0"
il.Emit(OpCodes.Ldarg_1);      // load "arg1"
il.Emit(OpCodes.Call, method); // call CompareTo
il.Emit(OpCodes.Ret);
var func = (Func<double, double, int>)dm.CreateDelegate(
     typeof(Func<double, double, int>));

或更简单地说,当然(尽管我怀疑这在一般情况下无济于事):

Func<double, double, int> func = (x,y) => x.CompareTo(y);

标签:delegates,func,c
来源: https://codeday.me/bug/20191110/2013595.html