成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#擴展方法詳細描述

開發 后端
這里介紹C#擴展方法,不過在C# 3.0微軟為我們提供了C#擴展方法。現在我們可以直接這樣調用了point.HasProperty(“X”);看看我是如何實現這個C#擴展方法的?
C#語言有很多值得學習的地方,這里我們主要介紹C#擴展方法,包括介紹好像string類型現在有了GetValueByName這個方法一樣,但實際上string并沒有這樣一個方法等方面。

在我們的編程生涯中我們要使用很多很多類庫,這些類庫有的是我們自己開發的,我們有她的代碼,有的是第三方發布的,我們不僅沒有他們的代碼,連看的機會都沒有。

作為.net程序員,我們每天都要和BCL(Base Class Linbrary)打交道。無疑,BCL做為一個年輕的框架類庫,她是成功的,但是還有一些時候我們還是得寫一些”Helper”方法來擴展類庫,由于我們不能修改類庫的源代碼,我們只有寫一個個的靜態類。雖然在使用上也算方便,但作為追求***的程序員來說總有些不雅。現在我就碰到這樣的事情,前兩天奉命寫一個從XML文件加載Chart圖的設置的方法,從XML加載數據綁定到對象上,這肯定是反射的用武之地了。我經常需要寫一些根據對象屬性名字來判斷這個對象是否有這個屬性或者根據屬性名獲取該屬性的值。還是按照平常一樣,我很快寫了一個 PropertyHelper,里面有兩個靜態方法:HasProperty,GetValueByName。

PropertyHelper.HasProperty(point, "X"),如此的調用也還過得去,不過在C# 3.0微軟為我們提供了C#擴展方法。現在我們可以直接這樣調用了point.HasProperty(“X”);看看我是如何實現這個C#擴展方法的?

  1. public static class PropertyExtension  
  2. {  
  3. public static object GetValueByName(this object self, string propertyName)  
  4. {  
  5. if (self == null)  
  6. {  
  7. return self ;  
  8. }  
  9. Type t = self.GetType();  
  10. PropertyInfo p = t.GetProperty(propertyName);  
  11. return p.GetValue(self, null);  
  12. }  

我給object類型添加了一個C#擴展方法,在.net里所有的類都繼承自object,那所有的類都默認的擁有這個方法了,真方便,呵呵。

注意到和普通的靜態方法有何差別?在這個方法的***個參數前面多了一個this關鍵字。

C#擴展方法:

1 方法所在的類必須是靜態的

2 方法也必須是靜態的

3 方法的***個參數必須是你要擴展的那個類型,比如你要給int擴展一個方法,那么***個參數就必須是int。

4 在***個參數前面還需要有一個this關鍵字。

按照上面的步驟寫你就得到了一個“C#擴展方法”,你可以像調用這個類的原生方法那樣去調用它:

  1. string str = "abc";  
  2. object len = str.GetValueByName("Length"); 

好像string類型現在有了GetValueByName這個方法一樣,但實際上string并沒有這樣一個方法。那這又是為什么呢?是我們可愛的編譯器在其中做了手腳。為了避開編譯器的干擾,我們來直接欣賞MSIL代碼:

  1. L_0008: ldstr "Length"  
  2. L_000d: call object TestLambda.PropertyExtension::GetValueByName(object, string) 

下面是對編寫C#擴展方法要注意的幾個原則(當然,仁者見仁、智者見智,這也是一家之言):

C#擴展方法有就近原則,也就是如果在你的程序里有兩個一模一樣的C#擴展方法,一個和你的使用類是處于同一命名空間里,另外一個處于別的命名空間里,這個時候會優先使用同一命名空間里的C#擴展方法,也就是說“血緣關系”越近,越被青睞。

很多人看到C#擴展方法也許眼里冒出金光,以后在設計的時候不管三七二十一,反正可以擴展。還有一些人會對類任意擴展,將以前一些作為”Helper”的方法統統使用C#擴展方法代替,注意的是C#擴展方法有“污染性”,所以我覺得在擴展的時候還是想想,是不是值得這樣擴展。

在擴展的時候也不要對比較高層的類進行擴展,像我上面對object的擴展我覺得就是不可取的,object是所有類的基類,一經擴展,所有的類都被“污染”了。

【編輯推薦】

  1. C# lock關鍵字敘述
  2. C#.Net FrameWork簡介
  3. C# new和override簡單描述
  4. C#值類型和引用類型淺談
  5. C#標識符簡單分析
責任編輯:佚名 來源: cnblogs
相關推薦

2009-08-10 16:40:03

C#索引器

2009-08-27 15:17:40

C# const變量

2009-09-07 15:15:43

2009-09-03 17:59:18

C#調用事件

2009-09-14 13:14:49

LINQ序列

2009-09-14 14:58:52

LINQ to XML

2009-09-14 16:33:55

LINQ To XML

2009-09-24 16:19:53

Hibernate應用

2009-09-25 14:28:40

Hibernate S

2009-10-15 15:04:42

VB.NET PadL

2009-11-18 11:14:49

2010-02-05 16:58:18

Android服務

2009-09-08 11:09:39

LINQ數據源

2010-04-09 17:45:06

Oracle索引

2009-10-15 14:59:45

網絡布線光纖技術

2009-09-25 11:04:32

Hibernate3實

2009-10-10 10:04:50

RHEL合法使用

2011-11-02 09:29:42

存儲虛擬化虛擬化

2009-10-16 11:02:40

VB調用動態連接庫

2009-10-12 12:54:58

VB.NET聲明API
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品亚洲一区二区三区浴池 | 亚洲精品在线视频 | 中文字幕黄色大片 | 91素人| 欧美淫片 | 婷婷午夜天 | 精品国产欧美 | 国产精品一区2区 | 国产一区二区三区四区在线观看 | 国产成人精品免高潮在线观看 | 国产婷婷精品 | 亚洲精品在线免费观看视频 | 中文字幕成人av | 午夜影视大全 | 亚洲精品二区 | 免费黄网站在线观看 | 精品国产乱码久久久久久闺蜜 | 日韩av在线一区二区 | 免费人成激情视频在线观看冫 | 国产精品久久久久久久久久免费看 | 亚洲日韩中文字幕一区 | 久久久国产一区二区三区四区小说 | 久久精品国产99国产精品 | 日韩精品久久一区二区三区 | 日韩欧美国产精品一区二区 | 日韩在线免费视频 | www久久国产| 欧美片网站免费 | 亚洲一区二区在线电影 | 久久香焦 | 中文字幕一区二区三区精彩视频 | 久视频在线| 亚洲性视频 | 国产精品久久一区二区三区 | 91毛片在线看 | 在线观看三级av | 国产精品久久久久久久久久 | www亚洲一区 | 国产精品视频一区二区三区 | 欧美中国少妇xxx性高请视频 | 国产夜恋视频在线观看 |