精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

再議C#方法中的反射方式和委托方式

開(kāi)發(fā) 后端
我們將要談到的是C#方法中的反射方式和委托方式,文中還將給出具體代碼,以方便大家測(cè)試和實(shí)踐。

  在開(kāi)發(fā)過(guò)程中對(duì)靜態(tài)方法的調(diào)用是通過(guò)類型名后面加個(gè)點(diǎn)而后是調(diào)用方法的名稱,對(duì)類型實(shí)例方法的調(diào)用是通過(guò)new一個(gè)對(duì)象,而后點(diǎn)加方法名稱,這是最熟悉不過(guò)的兩種方式。還可以通過(guò)讀取CLR元數(shù)據(jù),利用反射進(jìn)行方法調(diào)用。在利用反射方式調(diào)用方法時(shí),最重要的兩個(gè)類是System.Type和System.Reflection.MethodInfo。用MethodInfo類型的Invoke方法調(diào)用方法,必須傳入目標(biāo)對(duì)象實(shí)例的引用。如下:

  1.   publicclassCalculate  
  2.   {  
  3.   //使用反射可以調(diào)用私有方法  
  4.   private intAdd(intleftNum, intrightNum)  
  5.   {  
  6.   returnleftNum + rightNum;  
  7.   }  
  8.  }  
  9.   classProgram  
  10.   {  
  11.   staticvoidMain(string[] args)  
  12.   {  
  13.   //用type.getmethod的方法獲取類型方法,BindingFlags設(shè)置查找方法的范圍  
  14.   //本例是公有方法,私有方法而且是非靜態(tài)的才被查找,如果要查找靜態(tài)方法  
  15.   //需要設(shè)置BindingFlags.Static  
  16.   MethodInfomethod = typeof(Calculate).GetMethod("Add", BindingFlags.Public  
  17.   | BindingFlags.NonPublic  
  18.   |BindingFlags.Instance);  
  19.   if(method == nullreturn 
  20.   //調(diào)用方法的參數(shù)  
  21.   object[] paras ={ 10, 20 };  
  22.   //目標(biāo)對(duì)象實(shí)例:new Calculate()  
  23.   objectresult = method.Invoke(newCalculate(), paras);  
  24.   Console.WriteLine(result);  
  25.   Console.ReadLine();  
  26.   }  
  27.   } 

  委托方式

  任何對(duì)象都可以調(diào)用委托,只要方法返回值以及方法簽名和委托聲明一樣就行。

  通過(guò)閱讀CLR源代碼,整理了委托類的重要字段和幾個(gè)常用方法,自定義的委托類型都派生于MulticastDelegate。

  1.   publicabstractclassDelegate: ICloneable,ISerializable  
  2.   {  
  3.   // 調(diào)用目標(biāo)對(duì)象,實(shí)例方法為類型實(shí)例引用,靜態(tài)方法則為null  
  4.   internalObject_target;  
  5.   //指向調(diào)用方法  
  6.   internalIntPtr_methodPtr;  
  7.   //委托構(gòu)造器  
  8.   protectedDelegate(Objecttarget, Stringmethod)  
  9.   {  
  10.   //省略,具體看以查看clr源代碼  
  11.   }  
  12.   publicstaticDelegateCreateDelegate(Typetype, Objecttarget, Stringmethod)  
  13.   {  
  14.   //省略,具體看以查看clr源代碼  
  15.   }  
  16.   publicstaticDelegateCreateDelegate(Typetype, Typetarget, Stringmethod)  
  17.   {  
  18.   //省略,具體看以查看clr源代碼  
  19.   }  
  20.   publicstaticDelegateCombine(paramsDelegate[] delegates) {}  
  21.   publicstaticDelegateCombine(Delegatea, Delegateb) {}  
  22.   publicstaticDelegateRemove(Delegatesource, Delegatevalue){}  
  23.   }  
  24.   publicabstractclassMulticastDelegate: Delegate  
  25.   {  
  26.   privateObject_invocationList;  
  27.   protectedMulticastDelegate(Objecttarget, Stringmethod) : base(target, method) { }  
  28.   protectedMulticastDelegate(Typetarget, Stringmethod): base(target, method) { }  
  29.   } 

  從源代碼可以看出Delegate類提供了幾個(gè)重載的靜態(tài)方法CreateDelegate,方法返回值是Delegate類型。如果是實(shí)例方法則把對(duì)象引用傳遞給它,如是靜態(tài)方法則傳入對(duì)象類型。

  1.   publicdelegateintDelegateCaculate(inta,intb);  
  2.   publicclassCaculate  
  3.   {  
  4.   publicintAdd(intnum1, intnum2)  
  5.   {  
  6.   returnnum1 + num2;  
  7.   }  
  8.   publicstaticintSubtract(intnum1, intnum2)  
  9.   {  
  10.  returnnum2 - num1;  
  11.   }  
  12.   }  
  13.   classProgram  
  14.  {  
  15.   staticvoidMain(string[] args)  
  16.   {  
  17.   Caculatecaculate = newCaculate();  
  18.   TypetypeCaculate = typeof(Caculate);  
  19.   TypetypeDelegate = typeof(DelegateCaculate);  
  20.   DelegateCaculateadd = (DelegateCaculate)Delegate.CreateDelegate(typeDelegate, caculate, "Add");  
  21.   DelegateCaculatesubtract = (DelegateCaculate)Delegate.CreateDelegate(typeDelegate, typeCaculate, "Subtract");  
  22.   Console.WriteLine("add:"+ add(10, 20));  
  23.   Console.WriteLine("subtract:"+ subtract(10, 20));  
  24.   Console.ReadLine();  
  25.   }  
  26.   } 

  CreateDelegate需要通過(guò)遍歷元數(shù)據(jù)來(lái)獲取方法句柄。C#語(yǔ)法提供了更便利的方法來(lái)調(diào)用委托,可以簡(jiǎn)單通過(guò)類型名或者對(duì)象名來(lái)限定方法,而且不需要通過(guò)遍歷元數(shù)據(jù),C#編譯器使用底層CIL的ldftn或許ldvirtftn操作符獲取方法地址,相對(duì)來(lái)說(shuō)要比CreateDelegate快的多了。上面的Main方法可以改寫為

  1.   staticvoidMain(string[] args)  
  2.   {  
  3.   DelegateCaculateadd = newDelegateCaculate(newCaculate().Add);  
  4.   DelegateCaculatesubtract = newDelegateCaculate(Caculate.Subtract);  
  5.   Console.WriteLine("add:"+ add(10, 20));  
  6.   Console.WriteLine("subtract:"+ subtract(10, 20));  
  7.   Console.ReadLine();  
  8.   } 

  可以將多個(gè)委托對(duì)象放到委托對(duì)象數(shù)組中,一旦對(duì)其調(diào)用,CLR將遍歷委托數(shù)組,對(duì)其逐一調(diào)用。

  1.   publicdelegatevoidDelegateCaculate(inta,intb);  
  2.   publicclassCaculate  
  3.   {  
  4.   publicstaticvoidAdd(intnum1, intnum2)  
  5.   {  
  6.   Console.WriteLine((num1+ num2));  
  7.   }  
  8.   publicstaticvoidSubtract(intnum1, intnum2)  
  9.   {  
  10.   Console.WriteLine((num2- num1));  
  11.   }  
  12.   }  
  13.   classProgram  
  14.   {  
  15.   staticvoidMain(string[] args)  
  16.   {  
  17.   DelegateArray(newDelegateCaculate(Caculate.Add), newDelegateCaculate(Caculate.Subtract));  
  18.   Console.ReadLine();  
  19.   }  
  20.   staticvoidDelegateArray(DelegateCaculatea, DelegateCaculateb)  
  21.   {  
  22.   DelegateCaculatedelChain = null 
  23.   delChain = (DelegateCaculate)Delegate.Combine(delChain, a);  
  24.   delChain = (DelegateCaculate)Delegate.Combine(delChain, b);  
  25.   delChain(10, 20);  
  26.   }  
  27.   } 

  C#提供了更便捷的語(yǔ)法把委托對(duì)象添加到委托數(shù)組內(nèi),可以這樣修改上面的DelegateArray方法,

  1.   staticvoidDelegateArray(DelegateCaculatea, DelegateCaculateb)  
  2.  {  
  3.   DelegateCaculatedelChain = null 
  4.   delChain += a;  
  5.   delChain+=b;  
  6.   delChain(10, 20);  
  7.   } 

  當(dāng)執(zhí)行(DelegateCaculate)Delegate.Combine(delChain, a)時(shí),因?yàn)槲袛?shù)組中只有一個(gè)a對(duì)象,所以delChain也只是簡(jiǎn)單的指向a。示意圖如下

  當(dāng)執(zhí)行(DelegateCaculate)Delegate.Combine(delChain, b)是,因?yàn)槲袛?shù)組已經(jīng)有兩個(gè)對(duì)象了,這時(shí)會(huì)生成一個(gè)新的MulticastDelegate對(duì)象讓delChain指向它,而_invocationList指向一個(gè)委托數(shù)組對(duì)象,示意圖如下

  如果還有委托對(duì)象加入,將會(huì)再次生成一個(gè)新的MulticastDelegate對(duì)象讓delChain指向這個(gè)新對(duì)象,原來(lái)的對(duì)象則等待垃圾回收器進(jìn)行回收,這點(diǎn)可以查看CLR源代碼,每添加一個(gè)委托對(duì)象就調(diào)用一次方法NewMulticastDelegate,這個(gè)方法返回值是MulticastDelegate。

  委托與接口

  接口與委托都擁有調(diào)用特定方法的能力,所以他們?cè)谶@點(diǎn)很相像。但是接口需要目標(biāo)方法的類型聲明必須與該接口兼容,而委托可以被任何類型調(diào)用,只要該類型的目標(biāo)方法簽名和委托簽名匹配即可。

  那么何時(shí)用委托,何時(shí)用接口呢,msdn 總結(jié)的非常好,我就直接給粘貼過(guò)來(lái)了,

  委托在以下情況很有用:

  1、 調(diào)用單個(gè)方法。

  2、 一個(gè)類希望有方法規(guī)范的多個(gè)實(shí)現(xiàn)。

  3、 希望允許靜態(tài)方法實(shí)現(xiàn)規(guī)范。

  4、 希望類似事件的設(shè)計(jì)模式。

  5、 調(diào)用方不需要知道或獲得實(shí)現(xiàn)與委托簽名匹配的方法的對(duì)象。

  6、 實(shí)現(xiàn)的提供程序希望只對(duì)少數(shù)選擇組件“分發(fā)”規(guī)范實(shí)現(xiàn)。

  7、 需要方法的組合。

  接口在以下情況很有用:

  1、 規(guī)范定義一組相關(guān)方法。

  2、 類通常只實(shí)現(xiàn)規(guī)范一次。

  3、 接口的調(diào)用方希望轉(zhuǎn)換為接口類型或從接口類型轉(zhuǎn)換,以獲得其他接口或類。

原文鏈接:http://www.cnblogs.com/qiuwuyu/archive/2011/08/29/2157230.html

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2024-05-30 12:24:03

C#開(kāi)發(fā)

2024-10-05 00:00:35

Action?C#Func?

2024-09-29 09:28:38

Action?C#

2009-09-08 15:28:24

C#委托

2024-04-01 11:30:57

C#拷貝

2009-08-18 10:35:26

C#委托

2009-05-26 16:33:48

PythonC#Run As

2009-09-07 03:23:40

C# Main方法

2009-08-20 18:11:08

C#異步委托

2024-05-16 13:36:04

C#委托事件

2024-05-16 12:33:37

C#編程指針

2024-04-09 08:04:42

C#結(jié)構(gòu)await

2024-12-20 09:48:47

C#Python代碼

2009-08-18 10:25:41

C#委托

2009-06-24 10:49:16

JavaScript

2009-08-18 10:54:17

C#事件和委托

2024-05-15 09:11:51

委托事件C#

2009-08-03 13:23:04

C#編程組件-事件-委托

2009-08-24 16:19:42

C# 泛型方法

2009-04-10 09:55:44

C#反射.NET
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲欧美日韩国产综合精品二区| 五月亚洲婷婷| 久久精品欧美日韩| 国产欧美精品xxxx另类| 精品在线视频观看| 欧美激情极品| 欧美日韩国产影片| 国产精品一色哟哟| 第九色区av在线| 国产乱淫av一区二区三区| 98精品在线视频| 免费黄色激情视频| 久久视频在线观看| 欧美日韩aaa| 欧美国产亚洲一区| 国产精品刘玥久久一区| 久久精品夜色噜噜亚洲aⅴ| 亚洲va国产va天堂va久久| 美日韩一二三区| 伊人久久大香线蕉综合四虎小说 | 国产日本欧美一区二区| 亚洲影院色在线观看免费| 黄色在线观看国产| 日韩欧美伦理| 日韩成人在线播放| 不用播放器的免费av| 日本黄色免费在线| 亚洲激情图片qvod| 亚洲成人午夜在线| 亚洲人妻一区二区三区| 国产黄色91视频| 国产精品爽黄69| 国产精品777777| 雨宫琴音一区二区在线| 久久国产精品99国产精| 中文字幕第69页| 欧美美乳视频| 日韩久久免费视频| 制服丝袜在线第一页| 久久天堂久久| 91精品国产综合久久久久久漫画| 手机看片福利日韩| 欧美韩国亚洲| 色国产综合视频| 日本熟妇人妻xxxxx| 久久免费电影| 亚洲一线二线三线视频| 欧美极品少妇无套实战| av网站网址在线观看| 亚洲特黄一级片| 伊人久久99| 日韩精品黄色| 亚洲欧洲日本在线| 老司机av福利| 高h视频在线观看| 国产精品福利影院| 一区二区冒白浆视频| 在线视频三区| 中文字幕一区av| 一区二区视频国产| 黄色免费网站在线| 亚洲色图在线播放| 99视频精品全部免费看| av大大超碰在线| 亚洲一区二区三区不卡国产欧美| 天天做天天躁天天躁| 美足av综合网| 无码av中文一区二区三区桃花岛| 18禁网站免费无遮挡无码中文| 福利在线导航136| 亚洲一区二区三区四区不卡| 麻豆tv在线播放| 中文字幕一区久| 欧美亚洲精品一区| 欧美激情第3页| 视频一区视频二区欧美| 精品99999| 91l九色lporny| 天堂美国久久| 欧美精品videossex性护士| 国产五月天婷婷| 亚洲欧美日韩专区| 国产日本欧美一区二区三区| 国产高清免费在线观看| 不卡的看片网站| 欧美一区二区视频在线| 免费网站免费进入在线| 亚洲一区在线观看免费观看电影高清 | a网站在线观看| 成人app下载| 日韩女优中文字幕| aaa大片在线观看| 福利微拍一区二区| 国产一级片中文字幕| 久久影院资源站| 日韩在线观看免费全| 久久丫精品久久丫| 日本不卡视频一二三区| 91免费观看网站| 青青草手机在线| 亚洲欧美国产毛片在线| 国产一区二区在线视频播放| 24小时成人在线视频| 亚洲第一区第二区| 手机免费观看av| 99riav国产精品| 国产在线视频不卡| 日韩福利一区二区| 亚洲人123区| 日本男人操女人| 97久久亚洲| 色悠悠久久久久| 天天操中文字幕| 国产福利一区在线| 图片区小说区区亚洲五月| 久久免费电影| 欧美一二三区在线| 老司机深夜福利网站| 国产欧美日本| 国产精品播放| 一区二区三区视频网站| 色综合天天综合色综合av| 佐佐木明希电影| 色琪琪久久se色| 国产成人极品视频| 手机看片福利永久| 亚洲综合图片区| av噜噜在线观看| 欧美久久精品一级c片| 韩国视频理论视频久久| 精品久久久中文字幕人妻| 国产精品视频第一区| 三级4级全黄60分钟| 里番精品3d一二三区| 久久久久久国产精品久久| 国产又大又黑又粗| 中文字幕一区二区三区精华液| 国产又粗又长又大的视频| 香蕉视频一区二区三区| 久久久之久亚州精品露出| 精品国产99久久久久久宅男i| 中文av字幕一区| 亚洲福利精品视频| 国产一区二区三区不卡视频网站| 国产91精品久久久| 亚欧洲精品视频| 狠狠躁18三区二区一区| 中文乱码人妻一区二区三区视频| 亚洲黄色影院| 韩日午夜在线资源一区二区| free性欧美| 亚洲精品国产欧美| 91video| 国产亚洲自拍一区| 丁香婷婷激情网| 成人午夜av| 成人写真视频福利网| 免费a在线看| 91精品国产综合久久久久| 日韩在线中文字幕视频| 国产伦精品一区二区三区在线观看| 最新国产精品久久| 欧美欧美在线| 久久久亚洲国产天美传媒修理工| 亚洲第一黄色片| 精品久久中文字幕| 亚洲av无码一区二区三区人| 日韩有码一区二区三区| 一区二区不卡视频| 中文字幕区一区二区三| 国模gogo一区二区大胆私拍| 三级视频在线| 欧美色综合天天久久综合精品| 我要看一级黄色录像| 国产一区二区影院| 欧美视频免费看欧美视频| 九九视频精品全部免费播放| 国产精品日韩av| 在线观看中文字幕的网站| 亚洲精品国精品久久99热一| 波多野结衣激情视频| 亚洲天天做日日做天天谢日日欢 | 人妻中文字幕一区二区三区| 国产精品国产成人国产三级 | 一级黄色片免费看| 一区二区三区视频在线看| 中国黄色a级片| 美女看a上一区| 欧美国产日韩激情| 亚洲人亚洲人色久| 91九色视频导航| 国产传媒在线观看| 日韩中文理论片| 天堂在线观看av| 欧美日韩高清影院| 午夜精品久久久久久久久久久久久蜜桃 | 很黄很黄激情成人| 久久人人爽爽人人爽人人片av| 国产一区二区精品调教| 欧美—级高清免费播放| 成人77777| 亚洲第一区第一页| 国产有码在线观看| 日韩欧美成人区| 51精品免费网站| 久久久久久久久伊人| 日韩不卡的av| 日韩电影在线一区| 亚洲 自拍 另类小说综合图区| 日韩国产一区二区| 久久99精品久久久久久秒播放器| 亚洲一区导航| 国产黑人绿帽在线第一区| 国产第一页在线| 美女黄色丝袜一区| аⅴ资源新版在线天堂| 亚洲黄色成人网| 国产高清在线免费| 欧美特级限制片免费在线观看| 人人干人人干人人干| 亚洲精品菠萝久久久久久久| 国产白丝一区二区三区| 久久亚洲一级片| 波多野结衣视频播放| 国产一区二区三区黄视频 | 天天夜碰日日摸日日澡性色av| 亚洲91精品| 亚洲v国产v在线观看| 一区二区三区日本久久久 | 一级日本不卡的影视| 日韩精品久久久久久久的张开腿让 | 欧美日韩亚洲一区二区| 国产无码精品一区二区| 亚洲精品成人少妇| 国产成人av免费在线观看| 国产欧美一区二区三区在线老狼| 中文字幕5566| 久久伊人蜜桃av一区二区| 亚洲一级Av无码毛片久久精品| 国产精品影视在线观看| 成人亚洲免费视频| 久草这里只有精品视频| 欧美日韩一区二区三区69堂| 奇米影视一区二区三区| 久久精品免费网站| 久久精品综合| 成人精品小视频| 丝袜美腿成人在线| 人妻无码视频一区二区三区| 天堂在线亚洲视频| 欧美精品成人网| 肉丝袜脚交视频一区二区| 日本成人在线免费视频| 免费亚洲网站| 好男人www社区| 另类小说综合欧美亚洲| 午夜剧场在线免费观看| 国产综合色视频| 精产国品一区二区三区| yourporn久久国产精品| 欧美成人三级伦在线观看| 久久久精品日韩欧美| 亚洲图片另类小说| 中文字幕成人网| 欧美xxxooo| 亚洲综合色噜噜狠狠| 成人精品免费在线观看| 色哟哟一区二区在线观看 | 日韩激情一区二区| 亚洲36d大奶网| 国产精品一区二区三区四区| 污污免费在线观看| 久久久久久久免费视频了| 亚洲 欧美 国产 另类| 亚洲黄色在线视频| 欧美a∨亚洲欧美亚洲| 欧美少妇bbb| 午夜精品一区二区三| 精品视频久久久久久久| 在线看的av网站| 久久免费高清视频| www成人在线视频| 亚洲精品欧美极品| 亚洲最好看的视频| 亚洲一区二区四区| 精品99视频| 777视频在线| 成人黄色小视频在线观看| 大胸美女被爆操| 亚洲综合另类小说| 日韩精品在线一区二区三区| 欧美一二三四在线| 国产一级片在线播放| 色综合久久中文字幕综合网小说| 樱花草涩涩www在线播放| 国产在线视频不卡| 伊人久久大香线蕉| 精品视频在线观看一区二区| 日韩电影在线观看电影| 四虎永久免费观看| 国产精品系列在线| 国产女同在线观看| 91精品午夜视频| 你懂得网站在线| 久久久久久久91| 亚洲欧洲二区| 日韩在线国产| 狠狠色丁香久久综合频道| 亚洲免费一级视频| 97精品电影院| 久久久久无码国产精品| 欧美性大战久久久久久久 | 91首页免费视频| www深夜成人a√在线| 欧美性xxxxx极品| 亚洲欧美黄色片| 久久精品视频播放| 欧美亚洲大片| 麻豆av一区二区| 精品动漫3d一区二区三区免费| 日韩欧美亚洲另类| 国产亚洲欧洲一区高清在线观看| 日本免费在线播放| 欧美一三区三区四区免费在线看| 免费av在线电影| 9.1国产丝袜在线观看| 天堂久久av| 国产又粗又长又爽视频| 免费人成黄页网站在线一区二区 | 亚洲人成网站色在线观看| 一级黄色在线观看| 亚洲乱亚洲乱妇无码| 理论片午夜视频在线观看| 成人自拍视频网站| 一区二区三区四区日韩| 中文字幕精品一区二区三区在线| 国产欧美综合在线观看第十页| 国产91精品一区| 亚洲黄色www| 午夜伦理福利在线| 精品国产91亚洲一区二区三区www| 欧美激情一级片一区二区| 韩国三级hd中文字幕有哪些| 亚洲欧美日韩综合aⅴ视频| 中文字幕永久免费视频| 中文字幕日韩欧美精品在线观看| 亚洲电影有码| 日韩欧美一区二区视频在线播放 | 91蜜臀精品国产自偷在线| 亚洲性生活网站| 亚洲国产岛国毛片在线| 正在播放亚洲精品| 色yeye香蕉凹凸一区二区av| 欧美大片网站| 国产又大又长又粗又黄| 国产一区二区三区高清播放| 国产亚洲小视频| 亚洲国内精品在线| 浪潮色综合久久天堂 | 尤物在线视频| 国产人妖伪娘一区91| 综合久久久久| 丰满岳乱妇一区二区| 欧美日韩一区二区在线| 国产视频福利在线| 国产一区香蕉久久| 欧美成人综合| 成人欧美精品一区二区| 亚洲成精国产精品女| 日本中文字幕一区二区有码在线 | 日韩av高清在线看片| 久久亚洲私人国产精品va媚药| 国产在线观看第一页| 久久精品亚洲94久久精品| 91麻豆精品激情在线观看最新| heyzo亚洲| 国产精品伦一区| 好男人www在线视频| 日本在线观看天堂男亚洲| 日韩激情一区| 亚洲精品激情视频| 色拍拍在线精品视频8848| 麻豆传媒在线免费| 国内一区二区三区在线视频| 视频在线观看国产精品| 欧洲第一无人区观看| 日韩精品极品视频| 日韩黄色三级在线观看| 国产www免费| 国产女同性恋一区二区| 精品黑人一区二区三区在线观看 | 成人免费播放器| 国产清纯在线一区二区www| 国产不卡精品视频| 热草久综合在线| 欧美黄色精品| 一区二区三区久久久久| 精品久久久久久久久久久久久久久久久 | 91精品国产乱码久久久久久久| 精品久久久久一区二区|