C#特征 擴大辦法。本站提示廣大學習愛好者:(C#特征 擴大辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#特征 擴大辦法正文
作為.net法式員,我們天天都要和BCL(Base Class Linbrary)打交道。無疑,BCL做為一個年青的框架類庫,她是勝利的,然則還有一些時刻我們照樣得寫一些”Helper”辦法來擴大類庫,因為我們不克不及修正類庫的源代碼,我們只要寫一個個的靜態類。固然在應用上也算便利,但作為尋求完善的法式員來講總有些不雅觀。
如今我就碰著如許的工作,前兩天銜命寫一個從XML文件加載Chart圖的設置的辦法,從XML加載數據綁定到對象上,這確定是反射的用武之地了。我常常須要寫一些依據對象屬性名字來斷定這個對象能否有這個屬性或許依據屬性名獲得該屬性的值。照樣依照平凡一樣,我很快寫了一個PropertyHelper,外面有兩個靜態辦法:HasProperty,GetValueByName。
PropertyHelper.HasProperty(point, "X"),如斯的挪用也還過得去,不外在C# 3.0微軟為我們供給了擴大辦法。如今我們可以直接如許挪用了point.HasProperty(“X”);看看我是若何完成這個擴大辦法的?
public static class PropertyExtension { public static object GetValueByName(this object self, string propertyName) { if (self == null) { return self ; } Type t = self.GetType(); PropertyInfo p = t.GetProperty(propertyName); return p.GetValue(self, null); } }
我給object類型添加了一個擴大辦法,在.net裡一切的類都繼續自object,那一切的類都默許的具有這個辦法了,真便利,呵呵。
留意到和通俗的靜態辦法有何差異?在這個辦法的第一個參數後面多了一個this症結字。
擴大辦法:
1、辦法地點的類必需是靜態的
2、辦法也必需是靜態的
3、辦法的第一個參數必需是你要擴大的誰人類型,好比你要給int擴大一個辦法,那末第一個參數就必需是int。
4、在第一個參數後面還須要有一個this症結字。
依照下面的步調寫你就獲得了一個“擴大辦法”,你可以像挪用這個類的原生辦法那樣去挪用它:
string str = "abc";
object len = str.GetValueByName("Length");
似乎string類型如今有了GetValueByName這個辦法一樣,但現實上string並沒有如許一個辦法。那這又是為何呢?是我們心愛的編譯器在個中做了四肢舉動。為了避開編譯器的攪擾,我們來直接觀賞MSIL代碼:
L_0008: ldstr "Length"
L_000d: call object TestLambda.PropertyExtension::GetValueByName(object, string)
從MSIL中我們可以看出,這段代碼編譯後和挪用靜態辦法沒有任何的差異(從call指令來看,這是在挪用一個靜態辦法)。
從這裡可以曉得擴大辦法便可以應用實例挪用的方法也能夠直接應用靜態類挪用的方法:
str.GetValueByName("Length");
PropertyExtension.GetValueByName(str,"Length");
上面將對擴大辦法做一些細節的引見:
Visual Studio 2008對擴大辦法有智能感知的支撐,以下圖
在辦法的圖標上有一個與其他的都不雷同,他的漸變上面還帶有一個藍色的向下的箭頭,這就注解這個辦法是一個擴大辦法。
上面是對編寫擴大辦法要留意的幾個准繩(固然,仁者見仁、智者見智,這也是一家之言):
擴大辦法有就近准繩,也就是假如在你的法式裡有兩個如出一轍的擴大辦法,一個和你的應用類是處於統一定名空間裡,別的一個處於其余定名空間裡,這個時刻會優先應用統一定名空間裡的擴大辦法,也就是說“血緣關系”越近,越被喜愛。
許多人看到擴大辦法或許眼裡冒出金光,今後在設計的時刻不論三七二十一,橫豎可以擴大。還有一些人會對類隨意率性擴大,將之前一些作為”Helper”的辦法一切應用擴大辦法取代,留意的是擴大辦法有“淨化性”,所以我認為在擴大的時刻照樣想一想,是否是值得如許擴大。
在擴大的時刻也不要比較較高層的類停止擴大,像我下面對object的擴大我認為就是弗成取的,object是一切類的基類,一經擴大,一切的類都被“淨化”了。
揭橥與2008-07-16
於2008-08-06第一次更新