咨询区

  • AndreyAkinshin

场景是这样的,我自定义了一个 SomeDelegate 委托,然后将 Inc 方法灌入到其中,同时我也将 Inc 赋值给了 Func<int,int> 委托,参考代码如下:

class Program{static void Main(string[] args){SomeDelegate a = Inc;Func<int, int> b = Inc;}public delegate int SomeDelegate(int p);public static int Inc(int p){return p + 1;}}

现在问题来了,我想把 a 赋值给 b 这个委托,我发现居然不能转换。

Func<int, int> c = (Func<int, int>)a;

会报如下的错误:

Cannot convert type 'ConsoleApp5.Program.SomeDelegate' to 'System.Func<int, int>'

请问我该如下处理?

回答区

  • dtb

首先你要知道快捷写法的背后到底是什么?比如你提到的。

SomeDelegate a = Inc;
Func<int, int> b = Inc;

背后的真实代码为:

SomeDelegate a = new SomeDelegate(Inc);
Func<int, int> b = new Func<int, int>(Inc);

可以看到,上面两个是完全不相干的类型实例,无法用 cast 转换,这就好像你不可能将 string 转成 Dictionary 一样,不过也有变通的解决方法,比如下面这样。

Func<int, int> c = x => a(x);

上面这种写法是语法糖,全称大概是下面这样。

class MyLambda
{SomeDelegate a;public MyLambda(SomeDelegate a) { this.a = a; }public int Invoke(int x) { return this.a(x); }
}Func<int, int> c = new Func<int, int>(new MyLambda(a).Invoke);
  • Diego Mijelshon

我想到了两个转换方法。

  1. 提取目标的 Target 和 Method

static void Main(string[] args){SomeDelegate a = Inc;Func<int, int> b = Inc;Func<int, int> c = (Func<int, int>)Delegate.CreateDelegate(typeof(Func<int, int>), b.Target, b.Method);}
  1. 使用 Invoke 赋值

static void Main(string[] args){SomeDelegate a = Inc;Func<int, int> b = Inc;Func<int, int> c = a.Invoke;}

点评区

这种需求也挺有意思的,不过 a.Invokea(x) 这两个方式非常不错,学习了。

如何将自定义的 Delegate 转成 Func 委托?相关推荐

  1. 什么是LambdaExpression,如何转换成Func或Action(2)

    序言 在上一篇中,我们认识了什么是表达式树.什么是委托,以及它们的关系.可能是我功力不好,貌似大家都不怎么关注,没有讲解出不同角度的问题. 学习一种新技术,是枯燥的过程,只有在你掌握后并能运用时才能从 ...

  2. android 轨迹生成图,Android自定义View实现公交成轨迹图

    本文实例为大家分享了Android自定义View实现公交成轨迹图的具体代码,供大家参考,具体内容如下 总体分析下:水平方向recyclewview,item包含定位点,站台位置和站台名称. 下面看实现 ...

  3. 自定义字体文件解析成人眼可识别文字

    # coding=utf-8 from fontTools.ttLib import TTFont from PIL import Image, ImageDraw, ImageFont #绘制图片 ...

  4. C#中的三种委托方式:Func委托,Action委托,Predicate委托

    C#中的三种委托方式:Func委托,Action委托,Predicate委托. Func,Action,Predicate全面解析 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如 ...

  5. 委托——Action委托和Func委托

    委托:代购 private delegate void Buy();//定义想委托的事情--买东西 public static void DaiGou()//委托方--代购方 {Debug.logEr ...

  6. C#中的Action和Func委托

    Action和Func在.NetFramework3.0之后出现的 1. Action 1.1. 特性介绍: Acition 属于无参无返回值的函数类型 Action通过设置泛型,我们可以定义有多个参 ...

  7. delegate,event, lambda,Func,Action以及Predicate

    delegate 委托 可以理解为c++ 语言中的函数指针,标示了方法调用的回调函数的规范.强类型,便于编译时检查是它的最大优点,从此可以和void * 说再见了. event 事件 用以delega ...

  8. delegate、Lambda表达式、Func委托和Expression(TDelegate)表达式目录树

    1.delegate MSDN:一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似.与 C 中的函数指针不同,委托是面向对象的.类型安全的和保险的.委托的类型由委托的名称定义 class ...

  9. sqlserver varchar 对于 sum 运算符无效_在sqlserver上实现自定义函数四舍六入五成双...

    做过统计都知道关于保留几位小数有好几种方法,其中4舍6入5凑偶用的比较多,所以我就是sqlserver里面实现了一个自定义函数 定义 对于位数很多的近似数,当位数确定后,其后面多余的数字应该舍去,只保 ...

最新文章

  1. 一体化市场谋定国际品牌贸易 对话国际农民丰收节贸易会
  2. Windows 10+Ubuntu 16.04在MBR分区上安装双系统之后没有Windows 10的启动菜单解决方法...
  3. 数组遍历VS对象遍历
  4. LeetCode篇之栈:155(常数时间复杂度内找最小栈)
  5. PAT1015 德才论(C++)
  6. discuz php mysql_php下mysql数据库操作类(改自discuz)
  7. 11.盛水最多的容器
  8. 仿外卖mysql源码_进云仿美团外卖源码 v1.19
  9. OSX 安装配置Maven
  10. css基础知识 -- 颜色渐变
  11. 天龙八部天荒古镜服务器无法响应,天龙八部3 天荒古镜食谱与药品详细配方
  12. 苹果7如何设置手机邮箱服务器,iphone邮箱设置大全
  13. IT人必读的10个小故事
  14. 队列-链表-C语言实现
  15. 深度学习研究基因组学
  16. npm,nodejs如何升级
  17. Java开发岗位面试题归类---怎么好好的准备面试,也算是发展学习方向
  18. Django框架项目之支付功能——支付宝支付
  19. Android 对话框相关总结
  20. 【服务器托管、租用】

热门文章

  1. (转)java中的 | ^ 分别是什么?
  2. Android UI设计系统-android selector 开始自定义样式
  3. SQLite编译问题
  4. 实验——Windows常用网络测试命令
  5. 【转】2007高校BBS上20个睿智的冷笑话
  6. 【转载】负数的二进制
  7. 【Tomcat】Tomcat配置与优化(内存、并发、管理)【自己配置】
  8. 【BZOJ-2299】向量 裴蜀定理 + 最大公约数
  9. linq中的castT()及OfTypeT()
  10. *[hackerrank]Girlfriend Necklace