首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delegate.CreateDelegate从MethodInfo获取Func<>不适用于双重类型?

Delegate.CreateDelegate从MethodInfo获取Func<>不适用于双重类型?
EN

Stack Overflow用户
提问于 2018-01-17 13:12:16
回答 1查看 1K关注 0票数 4

我试图使用create为double.CompareTo。

我是这样创作的:

代码语言:javascript
复制
       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,它运行得很好:

代码语言:javascript
复制
       var method = typeof(string).GetMethod("CompareTo", new Type[] { typeof(string) });

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

我得到了一个论点例外,即“目标方法不能绑定,因为它的签名或安全透明度与委托类型不兼容”(免费从瑞典语翻译)

怎么啦?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-17 13:22:41

IIRC“扩展参数并将第一个参数视为目标”技巧仅适用于引用类型,例如string --大概是因为此实例方法调用成为带有第一个参数地址的静态调用,而不是简单地加载两个参数。你可以绕过它--不太优雅--通过:

代码语言:javascript
复制
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>));

或者更简单地说,当然(虽然我怀疑这在一般情况下是没有帮助的):

代码语言:javascript
复制
Func<double, double, int> func = (x,y) => x.CompareTo(y);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48302025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档