擴充套件方法的使用

2022-08-28 03:27:11 字數 3001 閱讀 1251

前言:打算分三個層面來介紹這個知識點,分別是:.net內建物件的擴充套件方法、一般物件的擴充套件方法、泛型物件的擴充套件方法。

什麼是擴充套件方法?回答這個問題之前,先看看我們一般情況下方法的呼叫。類似這樣的通用方法你一定寫過:

static

void main(string

args)

//將字串轉換為日期

public

static datetime getdatetime(string

strdate)

//得到非空的字串

public

static

string getnotnullstr(string

strres)

或者在專案中有乙個類似utils的工具類,裡面有多個helper,例如stringhelper、xmlhelper等等,每個helper裡面有多個static的通用方法,然後呼叫的時候就是stringhelper.getnotnullstr(「aa」);這樣。還有一種普通的用法就是new 乙個物件,通過物件去呼叫類裡面的非static方法。反正博主剛開始做專案的時候就是這樣寫的。後來隨著工作經驗的累積,博主看到了擴充套件方法的寫法,立馬就感覺自己原來的寫法太low了。進入正題。

1、.net內建物件的擴充套件方法

.net內部也有很多定義的擴充套件方法,例如我們linq常用的where(x=>x==true)、select()等等。當你轉到定義的時候你很容易看出來:public static ienumerablewhere(this ienumerablesource, funcpredicate)。當然我們也可以給.net物件新增擴充套件方法,比如我們要給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定義的方法一樣:

當然除了string,你可以給.net內建的其他物件加擴充套件方法,例如給datagridviewrow的擴充套件方法:

//

datagridviewrow的擴充套件方法,將當前選中行轉換為對應的物件

public

static t toobject(this datagridviewrow item) where t:class

).invoke(new

object

);

//反射得到泛型類的實體

propertyinfo pro = typeof(t).getproperties(bindingflags.instance |bindingflags.public);

type type =model.gettype();

foreach (propertyinfo propertyinfo in

pro)

if (!string

.isnullorempty(convert.tostring(dr[propertyinfo.name])))

}return

model;

}

這樣看上去就像在擴充套件.net framework。有沒有感覺有點高大上~

2、一般物件的擴充套件方法

和framework內建物件一樣,自定義的物件也可以增加擴充套件方法。直接上示例**:

public

class

person

public

int age

}

//

person的擴充套件方法,根據年齡判斷是否是成年人

public

static

bool getbischild(this

person operson)

main方法裡面呼叫:

var operson1 = new

person();

operson1.age = 20

;var bischild = operson1.getbischild();

和string擴充套件方法類似,就不多做解釋了。

3、泛型物件的擴充套件方法

除了上面兩種之外,博主發現其實可以定義乙個泛型的擴充套件方法。那麼,是不是所有的型別都可以直接使用這個擴充套件方法了呢?為了保持程式的嚴謹,下面的方法可能沒有實際意義,當開發中博主覺得可能存在這種場景:

public

static

class

datacontractextensions

catch

return

res;

}}public

class

test2

}

使用擴充套件方法有幾個值得注意的地方:

(1)擴充套件方法不能和呼叫的方法放到同乙個類中

(2)第乙個引數必須要,並且必須是this,這是擴充套件方法的標識。如果方法裡面還要傳入其他引數,可以在後面追加引數

(3)擴充套件方法所在的類必須是靜態類

(4)最好保證擴充套件方法和呼叫方法在同乙個命名空間下

可能你第一次使用這個會覺得很彆扭。你也許會說擴充套件方法和我以前用的static方法無論從**實現還是演算法效率都差不多嘛,是的!確實差不多,但使用多了之後會發現它確實能幫你省去很多**。

擴充套件方法使用

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

c 擴充套件方法的使用

擴充套件方法使您能夠向現有型別 新增 方法,而無需建立新的派生型別 重新編譯或以其他方式修改原始型別。你一定很疑問什麼是擴充套件方法!什麼是擴充套件方法?回答這個問題之前,先看看我們一般情況下方法的呼叫。類似這樣的通用方法你一定寫過 static void main string args 將字串轉...

C 擴充套件方法的使用

c 擴充套件方法可以在不繼承原有類的基礎上,為原有類新增方法,c 擴充套件方法可以合併到要原有類的例項上,擴充套件方法需要定義為靜態方法,並且第乙個引數必須為要擴充套件型別的當前例項 引數前加this關鍵字 public static class extendstring 首先定義乙個靜態類,定義乙...