.NET 3.5提供的擴充套件方法特性,可以在不修改原型別程式碼的情況下擴充套件它的功能。下面分享的這些擴充套件方法大部分來自於Code Project或是Stackoverflow,.NET為此還有一個專門提供擴充套件方法的網站(extensionMethod)。
涵蓋型別轉換,字串處理,時間轉化,集合操作等多個方面的擴充套件。
1 TolerantCast 匿名型別轉換
這個需求來源於介面中使用BackgroundWorker,為了給DoWork傳遞多個引數,又不想定義一個型別來完成,於是我會用到TolerantCast方法。參考如下的程式碼:
1 2 3 4 5 6 7 8 |
//建立匿名型別 var parm = new { Bucket = bucket, AuxiliaryAccIsCheck = chbAuxiliaryAcc.Checked, AllAccountIsCheck = chbAllAccount.Checked }; backgroundWorker.RunWorkerAsync(parm); private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { //解析轉換匿名型別 var parm = e.Argument.TolerantCast(new { Bucket = new RelationPredicateBucket(), AuxiliaryAccIsCheck = false, AllAccountIsCheck = false }); |
2 ForEach 集合操作
這個方法的定義很簡單但也很實用,它的使用方法如下:
1 2 |
var buttons = GetListOfButtons() as IEnumerable<Button>; buttons.ForEach(b => b.Click()); |
擴充套件方法的原始碼定義只有一行,原始碼如下:
1 2 3 4 |
public static void ForEach<T>(this IEnumerable<T> @enum, Action<T> mapFunction) { foreach (var item in @enum) mapFunction(item); } |
當我想對一個集合中的每個元素執行相同的操作時,常常會藉助於此方法實現。
3 Capitalize 字串首字母大寫
直接對字串操作,將字串的首字母改成大寫,原始碼參考如下:
1 2 3 4 5 6 |
public static string Capitalize(this string word) { if (word.Length <= 1) return word; return word[0].ToString().ToUpper() + word.Substring(1); } |
4 ToDataTable 強型別物件集合轉化為DataTable
開發中經常會遇到將List<Entity>轉化為DataTable,或是反之將DataTable轉化為List<Entity>,stackoverflow上有很多這個需求的程式碼,參考下面的程式程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public static DataTable ToDataTable<T>(this IEnumerable<T> varlist) { DataTable dtReturn = new DataTable(); // column names PropertyInfo[] oProps = null; if (varlist == null) return dtReturn; foreach (T rec in varlist) { // Use reflection to get property names, to create table, Only first time, others will follow if (oProps == null) { oProps = ((Type) rec.GetType()).GetProperties(); foreach (PropertyInfo pi in oProps) { Type colType = pi.PropertyType; if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof (Nullable<>))) { colType = colType.GetGenericArguments()[0]; } dtReturn.Columns.Add(new DataColumn(pi.Name, colType)); } } DataRow dr = dtReturn.NewRow(); foreach (PropertyInfo pi in oProps) { dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue (rec, null); } dtReturn.Rows.Add(dr); } return dtReturn; } |
5 SetAllValues 給陣列中的每個元素賦值
實現給陣列中的每個元素賦相同的值。
1 2 3 4 5 6 7 8 |
public static T[] SetAllValues<T>(this T[] array, T value) { for (int i = 0; i < array.Length; i++) { array[i] = value; } return array; } |
6 ToXml 序列化物件為Xml格式
可以將一個物件序列化為Xml格式的字串,儲存物件的狀態。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public static string ToXml<T>(this T o) where T : new() { string retVal; using (var ms = new MemoryStream()) { var xs = new XmlSerializer(typeof (T)); xs.Serialize(ms, o); ms.Flush(); ms.Position = 0; var sr = new StreamReader(ms); retVal = sr.ReadToEnd(); } return retVal; } |
7 Between 值範圍比較
可以判斷一個值是否落在區間範圍值中。
1 2 3 4 |
public static bool Between<T>(this T me, T lower, T upper) where T : IComparable<T> { return me.CompareTo(lower) >= 0 && me.CompareTo(upper) < 0; } |
類似這樣的操作,下面的方法是取2個值的最大值。
1 2 3 4 |
public static T Max<T>(T value1, T value2) where T : IComparable { return value1.CompareTo(value2) > 0 ? value1 : value2; } |
8 StartDate DueDate 開始值或末值
業務系統中常常會用到時間比較,如果系統是用DateTime.Now變數與DateTime.Today來作比較,前者總是大於後者的,為此需要做一個簡單轉化,根據需要將值轉化為開始值或末值,也就是0點0分0秒,或是23時59分59秒。
1 2 3 4 5 6 7 8 |
public static DateTime ConverToStartDate(this DateTime dateTime) { return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 0, 0, 0); } public static DateTime ConverToDueDate(this DateTime dateTime) { return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59); } |
9 First Day Last Day 月的第一天或是最後一天
1 2 3 4 5 6 7 8 9 10 11 |
public static DateTime First(this DateTime current) { DateTime first = current.AddDays(1 - current.Day); return first; } public static DateTime Last(this DateTime current) { int daysInMonth = DateTime.DaysInMonth(current.Year, current.Month); DateTime last = current.First().AddDays(daysInMonth - 1); return last; } |
10 Percent 百分比值
計算前一個數值佔後一個數值的百分比,常用於統計方面。
1 2 3 4 5 6 7 |
public static decimal PercentOf(this double position, int total) { decimal result = 0; if (position > 0 && total > 0) result=(decimal)((decimal)position / (decimal)total * 100); return result; } |
擴充套件方法原始碼下載:http://files.cnblogs.com/files/JamesLi2015/ExtensionMethod.zip