如何将自定义的 Delegate 转成 Func 委托?
生活随笔
收集整理的這篇文章主要介紹了
如何将自定义的 Delegate 转成 Func 委托?
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
咨詢區(qū)
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;}}現(xiàn)在問題來了,我想把 a 賦值給 b 這個委托,我發(fā)現(xiàn)居然不能轉(zhuǎn)換。
Func<int,?int>?c?=?(Func<int,?int>)a;會報如下的錯誤:
Cannot?convert?type?'ConsoleApp5.Program.SomeDelegate'?to?'System.Func<int,?int>'請問我該如下處理?
回答區(qū)
dtb
首先你要知道快捷寫法的背后到底是什么?比如你提到的。
SomeDelegate?a?=?Inc; Func<int,?int>?b?=?Inc;背后的真實代碼為:
SomeDelegate?a?=?new?SomeDelegate(Inc);? Func<int,?int>?b?=?new?Func<int,?int>(Inc);可以看到,上面兩個是完全不相干的類型實例,無法用 cast 轉(zhuǎn)換,這就好像你不可能將 string 轉(zhuǎn)成 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
我想到了兩個轉(zhuǎn)換方法。
提取目標(biāo)的 Target 和 Method
使用 Invoke 賦值
點評區(qū)
這種需求也挺有意思的,不過 a.Invoke 和 a(x) 這兩個方式非常不錯,學(xué)習(xí)了。
總結(jié)
以上是生活随笔為你收集整理的如何将自定义的 Delegate 转成 Func 委托?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何通过 C# kill 指定进程?
- 下一篇: C#的dapper使用