生活很精彩,所以我自己創造自己的喜歡的東西,或取之有方。
有時code累,重復的東西也多...也不是很美觀,怎么樣讓自己更爽趕快順手的編碼呢....
所以擴展方法也來了..
一、擴展方法描述一方:
擴展方法使您能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實例方法一樣進行調用。 對於用 C# 和 Visual Basic 編寫的客戶端代碼,調用擴展方法與調用在類型中實際定義的方法之間沒有明顯的差異。
擴展方法被定義為靜態方法,但它們是通過實例方法語法進行調用的。 它們的第一個參數指定該方法作用於哪個類型,並且該參數以 this 修飾符為前綴。 僅當您使用 using 指令將命名空間顯式導入到源代碼中之后,擴展方法才位於范圍中。
可以使用擴展方法來擴展類或接口,但不能重寫擴展方法。 與接口或類方法具有相同名稱和簽名的擴展方法永遠不會被調用。 編譯時,擴展方法的優先級總是比類型本身中定義的實例方法低。 換句話說,如果某個類型具有一個名為Process(int i) 的方法,而您有一個具有相同簽名的擴展方法,則編譯器總是綁定到該實例方法。 當編譯器遇到方法調用時,它首先在該類型的實例方法中尋找匹配的方法。 如果未找到任何匹配方法,編譯器將搜索為該類型定義的任何擴展方法,並且綁定到它找到的第一個擴展方法。 下面的示例演示編譯器如何確定要綁定到哪個擴展方法或實例方法。
二、實例Demo 之 DataTable=>List<T>
1.不說大家只說我自己,平時在項目中都會從數據庫中獲取數據DataTable,然后轉換成對應的實體對象列表。【這里實體的字段名和DataTable列名是對應的】
實體類:
public class SendMsgModel { public int Id { get; set; } public String DestNumber { get; set; } public String Content { get; set; } public String SmsId { get; set; } public String UserName { get; set; } public String Password { get; set; } }
擴展前代碼:
public class ToObject { /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dt"></param> /// <returns></returns> public static List<T> List<T>(DataTable dt) { var list = new List<T>(); Type t = typeof (T); var plist = new List<PropertyInfo>(typeof (T).GetProperties()); foreach (DataRow item in dt.Rows) { T s = System.Activator.CreateInstance<T>(); for (int i = 0; i < dt.Columns.Count; i++) { PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName); if (info != null) { if (!Convert.IsDBNull(item[i])) { info.SetValue(s, item[i], null); } } } list.Add(s); } return list; } }
調用:
DataTable dt= odbc.ExecuteDataTable(@"select top(100) Id , DestNumber , Content , SmsId , UserName , Password from Send";
var list=ToObject.List<SendMsgModel>(dt);
擴展后代碼:
/// <summary> /// 擴展類 /// </summary> public static class Extension
{
/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dt"></param> /// <returns></returns> public static List<T> List<T>(this DataTable dt) { var list = new List<T>(); Type t = typeof(T); var plist = new List<PropertyInfo>(typeof(T).GetProperties()); foreach (DataRow item in dt.Rows) { T s = System.Activator.CreateInstance<T>(); for (int i = 0; i < dt.Columns.Count; i++) { PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName); if (info != null) { if (!Convert.IsDBNull(item[i])) { info.SetValue(s, item[i], null); } } } list.Add(s); } return list; } }
調用:
DataTable dt= odbc.ExecuteDataTable(@"select top(100) Id , DestNumber , Content , SmsId , UserName , Password from Send"; var list2= dt.List<SendMsgModel>();
三、比較
1. 前 var list=ToObject.List<SendMsgModel>(dt);
2. 后 var list2= dt.List<SendMsgModel>();
使用風格上是不是就很大區別了?自己感受哈。Linq 的感覺?
之后繼續慢慢積累,對於性能方面還沒有研究,應該也不賴吧.