日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

如何将自定义的 Delegate 转成 Func 委托?

發(fā)布時間:2023/12/4 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何将自定义的 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)換方法。

  • 提取目標的 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;}

    點評區(qū)

    這種需求也挺有意思的,不過 a.Invoke 和 a(x) 這兩個方式非常不錯,學習了。

    總結(jié)

    以上是生活随笔為你收集整理的如何将自定义的 Delegate 转成 Func 委托?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。