C# 中有兩種基本數據類型值類型和引用類型 值類型包括簡單類型結構類型枚舉類型引用類型包括Object 類型類類型接口代表元字符串類型數組
說白了這篇就是擴展 int string double DateTime等基本類型這麼多數據類型如果int來個擴展double也來個擴展肯定會是一個造金字塔工程幸好有泛型幫我們但是有時泛型也不是萬能的這個以後有機會再說
為什麼我們需要擴展方法?一句話提高寫代碼的速度語義也清晰按道理說基於基本數據的擴展方法應該經常被用到才有意義否則只會污染被擴展的元素而怎麼才算常用這可沒什麼標准也不是我一個人說了算所以以下的擴展方法大家就根據自己的經驗判斷是否常用吧至少我的項目是用了不少
In 判斷一個元素是否在一個集合裡面
(這是我目前為止見到最好的擴展方法之一)
ScottGu 最初的版本
後經 鶴沖天 的潤色c#擴展方法奇思妙用高級篇一改進 Scottgu 的 In 擴展
//ScottGu In擴展 改進 public static bool In(this T t params T[] c) { return cAny(i => iEquals(t)); }
最後我也來湊個熱鬧
public static bool In(this T t params T[] c) { return cContains(t); //return cAny(i => iEquals(t)); }
示例
bool exist= In( );string[] helloworld = { Hello World ! };bool exist = HelloIn(helloworld ); InRange 判斷一個元素是否在某個范圍
public static bool InRange(this IComparable t T minT T maxT) { return tCompareTo(minT) >= && tCompareTo(maxT) <= ; } public static bool InRange(this IComparable t object minT object maxT) { return tCompareTo(minT) >= && tCompareTo(maxT) <= ; }
示例
//判斷是否在~的范圍bool result = InRange( ); //判斷是否在~的范圍bool result = InRange( );//判斷今天是否在年月日~年月日的范圍bool result = DateTimeNowInRange(new DateTime( ) new DateTime( ));//判斷牛B是否在牛A和牛C之間bool result = 牛BInRange(牛A 牛C);
上面最後一個示例來源於這句網語做一個徘徊於牛A和牛C之間的人
ForEach 遍歷集合
public static void ForEach(this IEnumerable source Action action){ foreach (T element in source) action(element);} public static void ForEach(this IEnumerable source Actionint> action){ int i = ; foreach (T element in source) action(element i++); }
注這兩個並非原創但實在太通用已經找不到出處
示例Linq to SQL 批量更新
//Linq to SQL IQueryable query = ;queryForEach(c => cName = Bruce);dbSubmitChanges();
示例設置行號
List list = listForEach((ci) => cLine = (i+));
Clone 克隆一個對象
public static T Clone(this T t) { return (T)CloneObject(t);} private static object CloneObject(object obj) { using (MemoryStream memStream = new MemoryStream()) { BinaryFormatter binaryFormatter = new BinaryFormatter(null new StreamingContext(StreamingContextStatesClone)); binaryFormatterSerialize(memStream obj); memStreamSeek( SeekOriginBegin); return binaryFormatterDeserialize(memStream); } }
示例克隆單個實體
Entity entity = new Entity { Name = Bruce Line = }; Entity cloneEntity = entityClone(); bool same = entityEquals(cloneEntity); // 被克隆的類必須標記為可序列化 [Serializable] class Entity { public string Name { get; set; } public int Line { get; set; } }
最後entityEquals(cloneEntity);的結果是false表明已經成功克隆了一個新對象
示例克隆集合
List list = new List(); listAdd(new Entity { Name = Bruce Line = }); listAdd(new Entity { Name = Jack Line = }); listAdd(new Entity { Name = Rose Line = }); listAdd(new Entity { Name = Tony Line = }); List cloneList = listClone();總結
擴展方法為我們封裝了常用的邏輯與以往靜態方法不同的是從使用者的角度來看已經不用關心這個方法是來自於那個類主要記著命名空間就可以所以一般做法是所有擴展方法屬於同一命名空間並按被擴展的類型分類如下圖
最後要說的是其實string類型的擴展方法應該是使用頻率最高的但基於string的擴展方法網上隨便一抓一大把這裡就不重復列舉了
From:http://tw.wingwit.com/Article/program/net/201311/13116.html