如何将自定义的 Delegate 转成 Func 委托?
咨询区
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
我想到了两个转换方法。
提取目标的 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);}
使用 Invoke 赋值
static void Main(string[] args){SomeDelegate a = Inc;Func<int, int> b = Inc;Func<int, int> c = a.Invoke;}
点评区
这种需求也挺有意思的,不过 a.Invoke
和 a(x)
这两个方式非常不错,学习了。
如何将自定义的 Delegate 转成 Func 委托?相关推荐
- 什么是LambdaExpression,如何转换成Func或Action(2)
序言 在上一篇中,我们认识了什么是表达式树.什么是委托,以及它们的关系.可能是我功力不好,貌似大家都不怎么关注,没有讲解出不同角度的问题. 学习一种新技术,是枯燥的过程,只有在你掌握后并能运用时才能从 ...
- android 轨迹生成图,Android自定义View实现公交成轨迹图
本文实例为大家分享了Android自定义View实现公交成轨迹图的具体代码,供大家参考,具体内容如下 总体分析下:水平方向recyclewview,item包含定位点,站台位置和站台名称. 下面看实现 ...
- 自定义字体文件解析成人眼可识别文字
# coding=utf-8 from fontTools.ttLib import TTFont from PIL import Image, ImageDraw, ImageFont #绘制图片 ...
- C#中的三种委托方式:Func委托,Action委托,Predicate委托
C#中的三种委托方式:Func委托,Action委托,Predicate委托. Func,Action,Predicate全面解析 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如 ...
- 委托——Action委托和Func委托
委托:代购 private delegate void Buy();//定义想委托的事情--买东西 public static void DaiGou()//委托方--代购方 {Debug.logEr ...
- C#中的Action和Func委托
Action和Func在.NetFramework3.0之后出现的 1. Action 1.1. 特性介绍: Acition 属于无参无返回值的函数类型 Action通过设置泛型,我们可以定义有多个参 ...
- delegate,event, lambda,Func,Action以及Predicate
delegate 委托 可以理解为c++ 语言中的函数指针,标示了方法调用的回调函数的规范.强类型,便于编译时检查是它的最大优点,从此可以和void * 说再见了. event 事件 用以delega ...
- delegate、Lambda表达式、Func委托和Expression(TDelegate)表达式目录树
1.delegate MSDN:一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似.与 C 中的函数指针不同,委托是面向对象的.类型安全的和保险的.委托的类型由委托的名称定义 class ...
- sqlserver varchar 对于 sum 运算符无效_在sqlserver上实现自定义函数四舍六入五成双...
做过统计都知道关于保留几位小数有好几种方法,其中4舍6入5凑偶用的比较多,所以我就是sqlserver里面实现了一个自定义函数 定义 对于位数很多的近似数,当位数确定后,其后面多余的数字应该舍去,只保 ...
最新文章
- 一体化市场谋定国际品牌贸易 对话国际农民丰收节贸易会
- Windows 10+Ubuntu 16.04在MBR分区上安装双系统之后没有Windows 10的启动菜单解决方法...
- 数组遍历VS对象遍历
- LeetCode篇之栈:155(常数时间复杂度内找最小栈)
- PAT1015 德才论(C++)
- discuz php mysql_php下mysql数据库操作类(改自discuz)
- 11.盛水最多的容器
- 仿外卖mysql源码_进云仿美团外卖源码 v1.19
- OSX 安装配置Maven
- css基础知识 -- 颜色渐变
- 天龙八部天荒古镜服务器无法响应,天龙八部3 天荒古镜食谱与药品详细配方
- 苹果7如何设置手机邮箱服务器,iphone邮箱设置大全
- IT人必读的10个小故事
- 队列-链表-C语言实现
- 深度学习研究基因组学
- npm,nodejs如何升级
- Java开发岗位面试题归类---怎么好好的准备面试,也算是发展学习方向
- Django框架项目之支付功能——支付宝支付
- Android 对话框相关总结
- 【服务器托管、租用】
热门文章
- (转)java中的 | ^ 分别是什么?
- Android UI设计系统-android selector 开始自定义样式
- SQLite编译问题
- 实验——Windows常用网络测试命令
- 【转】2007高校BBS上20个睿智的冷笑话
- 【转载】负数的二进制
- 【Tomcat】Tomcat配置与优化(内存、并发、管理)【自己配置】
- 【BZOJ-2299】向量 裴蜀定理 + 最大公约数
- linq中的castT()及OfTypeT()
- *[hackerrank]Girlfriend Necklace