前言:上篇 序列化效率比拼——誰是最後的贏家newtonsoft.json 介紹了下序列化方面的知識。看過demo的朋友可能注意到了裡面就用到過泛型的擴充套件方法,本篇打算總結下c#擴充套件方法的用法。博主打算分三個層面來介紹這個知識點,分別是:.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 ienumerable where(this ienumerable source, 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
<
t>
(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;
}
view code
這樣看上去就像在擴充套件.net framework。有沒有感覺有點高大上~
2、一般物件的擴充套件方法
和framework內建物件一樣,自定義的物件也可以增加擴充套件方法。直接上示例**:
public
class
person
public
int age
}
複製**
//person的擴充套件方法,根據年齡判斷是否是成年人
public
static
bool
getbischild
(this
person operson)
複製**
main方法裡面呼叫:
var operson1 =
newperson()
;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方法無論從**實現還是演算法效率都差不多嘛,是的!確實差不多,但使用多了之後會發現它確實能幫你省去很多**。
C 的擴充套件方法
一 擴充套件方法必須符合以下要求 1.方法所在的類必須是靜態的 2.方法也必須是靜態的 3.方法的第乙個引數必須是你要擴充套件的那個型別,比如你要給int擴充套件乙個方法,那麼第乙個引數就必須是int。4.在第乙個引數前面還需要有乙個this關鍵字。二 擴充套件方法的幾點總結 1 可以向類中新增新方...
C 擴充套件方法
c 語言從3.0開始增加了乙個很特別的功能 擴充套件方法。那麼擴充套件方法起什麼作用呢?很多時候我們想為已經存在的類擴充套件某些功能,而又沒有必要去繼承該類,甚至有時候這個類根本就不允許繼承,如string類,這時候就可以使用擴充套件方法來為其擴充套件功能。下面舉例說明 一 我們建立乙個類庫如下 c...
C 擴充套件方法
c 語言從3.0開始增加了乙個很特別的功能 擴充套件方法。那麼擴充套件方法起什麼作用呢?很多時候我們想為已經存在的類擴充套件某些功能,而又沒有必要去繼承該類,甚至有時候這個類根本就不允許繼承,如string類,這時候就可以使用擴充套件方法來為其擴充套件功能。下面舉例說明 一 我們建立乙個類庫如下 c...