精品欧美一区二区三区在线观看 _久久久久国色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)

国产青青草视频| 加勒比婷婷色综合久久| 欧美男女交配| 欧美激情在线一区二区| 成人午夜两性视频| 久久久精品国产sm调教网站| 亚洲图片久久| 欧美一二三四区在线| 亚洲中文字幕无码中文字| 91福利在线视频| 成人免费视频播放| 国产精品久久久久av| 男女免费视频网站| 欧美老女人另类| 欧美成人福利视频| 欧美性猛交xxx乱久交| 青青草原国产在线| 国产视频911| 精品久久久久久中文字幕动漫| 少妇一级淫片日本| 影音先锋亚洲精品| 丝袜亚洲另类欧美重口| 最近中文字幕无免费| 97久久中文字幕| 在线看一区二区| 精品少妇人欧美激情在线观看| 天堂аⅴ在线地址8| 久久综合色一综合色88| 国产精品三区www17con| 国产又粗又猛又爽又黄91| 午夜在线视频观看日韩17c| 毛片精品免费在线观看| 欧美老女人性生活视频| 天海翼精品一区二区三区| 日韩欧美亚洲一区二区| mm131亚洲精品| 成人日韩在线观看| 欧美性猛交xxxx富婆| 国产aaa免费视频| 国产cdts系列另类在线观看| 国产精品理论片| 日韩动漫在线观看| 日本午夜在线视频| zzijzzij亚洲日本少妇熟睡| 成人91免费视频| 国产视频手机在线观看| 久久99久久99精品免视看婷婷| 国产精品久久久久久久app| 中文字幕一区二区人妻电影| 在线视频精品| 国产91精品不卡视频| 亚洲一区二区91| 伊人成人网在线看| 久久久久国产精品免费| 久久久久久久黄色| 好看的亚洲午夜视频在线| 久精品免费视频| 麻豆疯狂做受xxxx高潮视频| 欧美精品啪啪| 欧美第一淫aaasss性| 国产亚洲第一页| 亚洲激精日韩激精欧美精品| 国语自产精品视频在线看| 久久精品性爱视频| 国产美女诱惑一区二区| 日本精品在线视频| 无码久久精品国产亚洲av影片| 日本亚洲一区二区| 成人国产精品一区| 国产草草影院ccyycom| 国产福利精品导航| 国产精品一区二区三区在线| 天天干天天草天天射| 久久中文娱乐网| 亚洲午夜精品久久久久久浪潮| 在线激情网站| 亚洲激情男女视频| 老太脱裤让老头玩ⅹxxxx| 二区三区不卡| 欧美女孩性生活视频| 少妇性l交大片7724com| 欧美精品中文| 中文字幕亚洲欧美日韩在线不卡| 97在线观看免费高| 99精品国产一区二区青青牛奶| 国产91亚洲精品| 91精品国自产| 不卡av在线网| 亚洲欧美久久234| 污视频网站免费在线观看| 婷婷综合久久一区二区三区| 一区二区三区视频网| 亚洲91网站| 亚洲社区在线观看| www.超碰在线观看| 国产日韩一区二区三区在线| 成人激情视频小说免费下载| 亚洲精品无遮挡| 国产人成一区二区三区影院| 正在播放久久| 英国三级经典在线观看| 7777精品伊人久久久大香线蕉完整版| 国产国语老龄妇女a片| 少妇精品久久久一区二区三区 | 国产成人aa精品一区在线播放| 中文字幕av在线免费观看| 成人黄色网址在线观看| 亚洲图片都市激情| 在线观看涩涩| 欧美一区二区高清| 五月婷婷欧美激情| 亚洲毛片视频| 亚洲伊人一本大道中文字幕| 二区在线视频| 午夜久久福利影院| 国产又粗又猛大又黄又爽| 国产午夜一区| 97国产在线观看| 国产乱叫456在线| 国产欧美日韩视频在线观看| 免费看国产曰批40分钟| 日韩精品一区国产| 最近2019年手机中文字幕| 欧美日韩乱国产| 国产a精品视频| 婷婷视频在线播放| 电影一区二区| 一本色道久久88综合日韩精品| 亚洲欧美在线观看视频| 国产精品一区二区在线播放| 一区二区三区在线观看www| 欧美xoxoxo| 国产午夜精品久久久| 日韩欧美不卡视频| 成人激情动漫在线观看| 亚洲啊啊啊啊啊| 99国内精品久久久久| 中文字幕欧美日韩va免费视频| 一级片免费在线播放| 97精品电影院| 中文字幕日本最新乱码视频| 欧美日韩破处| 91精品国产免费久久久久久| 欧美一区二区三区成人片在线| 一区二区三区中文字幕电影| 深夜福利网站在线观看| 91国语精品自产拍| 成人激情黄色网| 黄a在线观看| 91精品国产黑色紧身裤美女| 日韩av手机在线免费观看| 国产自产视频一区二区三区| 日本xxx免费| 日韩在线观看中文字幕| 欧美激情视频免费观看| 亚洲成人精品女人久久久| 一区二区三区免费网站| 911亚洲精选| 在线亚洲观看| 欧美另类网站| 91国拍精品国产粉嫩亚洲一区| 国产午夜精品视频| 中文字幕 国产| 国产精品电影一区二区三区| 手机版av在线| 牛夜精品久久久久久久99黑人| 91精品国产91久久久久青草| 欧美xxx黑人xxx水蜜桃| 日韩大片免费观看视频播放| 无码人妻丰满熟妇精品区| 亚洲国产精华液网站w| 中文字幕av不卡在线| 久操精品在线| 91精品视频在线看| 欧美xxxbbb| 亚洲欧洲第一视频| 国产又大又黄的视频| 亚洲一卡二卡三卡四卡五卡| 亚洲一区二区观看| 男女激情视频一区| 日本一级黄视频| 欧美中文一区| 91久久精品久久国产性色也91| 九七久久人人| 日韩av在线电影网| 在线免费观看一级片| 亚洲成人中文在线| 在线免费观看视频| 成人av资源在线| 五月婷婷丁香综合网| 欧美日韩福利| 激情五月综合色婷婷一区二区 | www.成人.com| 欧美视频一二三区| 国产一级做a爱免费视频| 国产夜色精品一区二区av| 国产5g成人5g天天爽| 亚洲中字在线| 精品国产无码在线| 99re91这里只有精品| 国产精品直播网红| 在线观看免费视频你懂的| 亚洲日韩第一页| 亚洲av无码乱码国产麻豆| 色噜噜狠狠一区二区三区果冻| 国产一区在线观看免费| 99久久久精品免费观看国产蜜| 日韩av.com| 天堂影院一区二区| 日韩视频在线视频| 一级欧洲+日本+国产 | 婷婷另类小说| 欧美激情国产日韩| 91精品国产自产精品男人的天堂| 国产精品一区二区久久精品 | 精品久久久久久国产91| 国精品人伦一区二区三区蜜桃| 91浏览器在线视频| 国产精品果冻传媒| 国产一区二三区好的| 国产理论在线播放| 国产一区二区三区久久| 香港三级日本三级a视频| 91亚洲自偷观看高清| 欧美不卡三区| 日本欧美高清| 久久99精品久久久久久水蜜桃 | 日本免费在线视频不卡一不卡二| 99热亚洲精品| 韩日成人av| 亚洲 欧美 综合 另类 中字| 中文精品久久| 中文字幕一区二区三区四区五区 | 黄色影视在线观看| 久久视频国产| 亚洲综合首页| 国产精品国产三级国产在线观看 | 7788色淫网站小说| 国产·精品毛片| 色欲欲www成人网站| 国内成+人亚洲+欧美+综合在线| 午夜精品中文字幕| 美国三级日本三级久久99| 2025韩国理伦片在线观看| 日本中文字幕一区| 污污网站免费看| 人禽交欧美网站| 一本一道久久a久久综合蜜桃| 另类小说综合欧美亚洲| 午夜免费看毛片| 激情综合网最新| 亚洲天堂小视频| 东方aⅴ免费观看久久av| 国产婷婷在线观看| 91在线播放网址| 老熟妇一区二区| 国产精品家庭影院| 三级影片在线看| 一区二区三区欧美视频| 国产无套内射又大又猛又粗又爽 | 久久亚洲精品一区| 午夜成年人在线免费视频| 欧美极品欧美精品欧美视频| 91超碰国产在线| 日本不卡高字幕在线2019| 成人在线网站| 91手机视频在线观看| 亚洲精品a区| 欧美日韩综合久久| 亚洲精品国产成人影院| a天堂资源在线观看| 亚洲专区一区二区三区| 欧美性猛交久久久乱大交小说| 美女网站视频久久| 久久av一区二区三| 久久综合久久综合久久| 99热6这里只有精品| 亚洲最快最全在线视频| 免费黄色网址在线| 欧美美女一区二区| 香蕉视频网站在线| 久久精品99久久久久久久久| 黄色美女视频在线观看| 国产va免费精品高清在线| 日韩一级特黄| 久久精品国产精品国产精品污| 成人精品中文字幕| 国产真实老熟女无套内射| 久久狠狠一本精品综合网| 国产免费中文字幕| 97精品超碰一区二区三区| 欧美性猛交xxxx乱大交少妇| 亚洲福利一二三区| 中文在线a天堂| 亚洲大胆美女视频| 色开心亚洲综合| 午夜精品99久久免费| 亚洲伦理久久| 欧美精品123| 国产一区观看| 天天操狠狠操夜夜操| 91麻豆免费在线观看| 久久99久久98精品免观看软件| 91官网在线观看| 污污网站在线免费观看| 日韩视频精品在线| 91精品产国品一二三产区| 91青青草免费在线看| 精品理论电影| 欧美老熟妇喷水| 国产精品888| 娇小11一12╳yⅹ╳毛片| 欧美日韩免费网站| 亚洲大尺度网站| 久久精品国产精品| 成人日韩精品| 欧美理论一区二区| 99成人在线| 在线播放av网址| 亚洲免费资源在线播放| 中文天堂在线视频| 亚洲精品日韩久久久| 多野结衣av一区| 成人区精品一区二区| 天堂美国久久| 自拍偷拍21p| 欧美国产激情一区二区三区蜜月| 国产www在线| 亚洲国产91色在线| h片精品在线观看| 成人午夜电影在线播放| 伊人久久大香线| 在线观看视频你懂得| 亚洲三级电影网站| 国产一区二区三区成人| 最好看的2019年中文视频| 91九色综合| 在线看无码的免费网站| 另类成人小视频在线| 萌白酱视频在线| 欧美日韩亚洲综合一区二区三区| 高清中文字幕一区二区三区| 国产精品国产亚洲伊人久久 | 4438五月综合| 综合久久国产| 国产一区二区三区在线观看免费视频| 最新日韩免费视频| 91精品视频网| 91国内在线| 国产伦视频一区二区三区| 亚洲激情影院| 免费看黄色aaaaaa 片| 欧美日韩国产精品一区二区三区四区 | 亚洲国产第一页| 天堂中文在线播放| 蜜桃精品久久久久久久免费影院| 视频在线在亚洲| 少妇视频在线播放| 91精品国产91久久综合桃花 | 日韩av自拍| 亚洲综合伊人久久| 亚洲自拍与偷拍| 婷婷丁香一区二区三区| 欧美在线视频免费观看| 成人av国产| 精品亚洲视频在线| 亚洲国产视频一区二区| 深夜福利视频在线免费观看| 国产精品久久久久久久久久久久 | 亚洲欧美日韩国产另类专区| 精品人妻一区二区三区浪潮在线| 欧美高清自拍一区| 麻豆一区二区| 婷婷丁香激情网| 亚洲精品五月天| 日本一本草久在线中文| 国产色综合天天综合网| 国模一区二区三区| 免费黄色在线视频| 69堂国产成人免费视频| 九色91在线| 午夜精品视频在线观看一区二区 | 9.1成人看片| 欧美日韩亚洲另类| 97天天综合网| 亚洲自拍的二区三区| 99久久婷婷国产综合精品| 在线观看国产黄| 国内精品在线一区| 欧美高清视频手机在在线| 麻豆短视频在线观看| 欧美午夜片在线看| a国产在线视频| 亚洲AV无码成人精品一区| 99国产精品国产精品毛片| 国产男男gay网站| 国产精品扒开腿做爽爽爽男男 | 日韩有码一区| 久久精品国产露脸对白| 色婷婷av一区二区三区大白胸 |