擴充套件類和擴充套件方法的使用場景

2021-10-09 15:42:03 字數 1677 閱讀 6570

作為c#程式設計師,我們一直要跟自帶類庫(bcl - base class library)或者第三方類庫打dao交道,有時候我們無法檢視他們的**,但是我們需要一些新的功能,helper類就應運而生了,我們開發出乙個個的靜態方法以方便呼叫,c#3.0之後微軟為我們提供了擴充套件類,以實現對原有類的擴充套件,這是乙個非常好的替代helper類的途徑。

擴充套件類和擴充套件方法的使用方法

首先舉乙個擴充套件類的例子,假定我們需要string類實現乙個新的功能,通過屬性名字獲取屬性的值,我們可以通過擴充套件類的擴充套件方法實現。

/// /// 擴充套件類和擴充套件方法必須是靜態的,擴充套件方法的第乙個引數必須為原有類自身,this關鍵字是必須的

///

public static class stringextension

type t = self.gettype();

propertyinfo p = t.getproperty(propertyname);

return p.getvalue(self, null);

}}

原有類可以直接呼叫擴充套件方法,

string str = "123"; 

int len = str.getvaluebyname("length");

怎麼樣,方便吧。

擴充套件方法必須遵守以下規則:

1.擴充套件類必須是靜態的;

2.擴充套件方法必須是靜態的

3.擴充套件方法的第乙個引數必須以this開頭,引數必須是原有類的型別,如果我們擴充套件decimal類,第乙個引數必須為decimal

為什麼擴充套件類和擴充套件方法必須為靜態的

讓我們看一看編譯之後的msil**吧,是不是很像我們曾經寫過的helper類呼叫方法,看來str.getvaluebyname("length")等效於stringextension.getvaluebyname(str,"length").

這是微軟對編譯器做的乙個優化,使之更人性化,使用更方便。微軟的出發點可能只是希望對原有類做方法擴充套件,不希望把擴充套件類作為實體類來使用,所以從設計上就已經做了處理,杜絕這種情況發生,靜態類是不允許被例項化的。

我們要給string物件加乙個擴充套件方法(注意這個方法不能和呼叫的main方法放在同乙個類中):

public static string getnotnullstr(this string strres)

然後在main方法裡面呼叫:

static void main(string args)

public static string getnotnullstr(this string strres)其中this string就表示給string物件新增擴充套件方法。

那麼在同乙個命名空間下面定義的所有的string型別的變數都可以.getnotnullstr()這樣直接呼叫。

strtest.getnotnullstr();為什麼這樣呼叫不用傳引數,是因為strtest就是作為引數傳入到方法裡面的。你可以試試。使用起來就和.net framework定義的方法一樣:

Unity使用擴充套件方法類

擴充套件方法在實現上和普通的物件導向程式設計是一樣的,換句話說,我們只需要定義乙個類,然後在裡面新增並實現相應的方法即可。但是這裡需要注意的地方有三點,第一,實現擴充套件方法的類必須是靜態類且類的名稱和實現擴充套件方法的類無關 第 二 實現擴充套件方法的類方法必須是靜態方法 第 三 實現擴充套件方法...

使類的擴充套件更簡單 擴充套件方法

1 什麼是擴充套件方法?擴充套件方法,首先是一種方法,它可以用來擴充套件已定義型別中的方法成員。在擴充套件方法誕生之前,如果想為乙個已有型別自定義含有特殊邏輯的新方法時,你必須重新定義乙個型別來繼承已有型別,以這種方式來新增方法。如果基類有抽象方法,則還要重新去實現這個抽象方法。這樣,為了擴充套件乙...

擴充套件方法使用

上篇說道擴充套件方法的簡單介紹,這裡就說繼續上篇說下使用方法。擴充套件方法能夠幫助我們向現有型別中加入方法 來符合我們的須要。比如我們能夠用擴充套件方法向 string 類中加入乙個isvalidemailaddress方法 用於檢測是否符合 email標準.擴充套件方法規定類必須是靜態的 裡面包括...