今天上班不太忙,就想着總結一下反射、擴展方法、以及lambda表達式的用法,自己就寫了個小DEMO記錄一下,希望各位大牛們看到后覺得不對的地方請及時提出。這篇文章中我只說明我的用法,作為一個備忘,基本的語法我不講解,對這些概念不熟悉的童鞋在博客園上搜素一下,呢那個找到很多相關的講解,小弟就先拋磚引玉了。
另附鏈接一枚,如果你想知道c#1.0--c#4.0 主要基礎知識匯總,請猛點下面鏈接,你還可以看到該片文章中提到的知識點。
概述反射
- 通過反射可以提供類型信息,從而使得我們開發人員在運行時能夠利用這些信息構造和使用對象。
- 反射機制允許程序在執行過程中動態地添加各種功能。
詳細見我的163博客.NET反射詳解
擴展方法
引MSDN對擴展方法的定義: 擴展方法使你能夠向現有類型“添加”方法(包括你自定義的類型和對象噢),而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。擴展方法是一種特殊的靜態方法,但是可以像擴展類型上的實例方法一樣進行調用。對於用C#編寫的客戶端代碼,調用擴展方法與調用在類型中實際定義的方法之間沒有明顯的差異。
lambda表達式
引百度百科對Lambda的定義“Lambda 表達式”是一個匿名函數,它可以包含表達式和語句,並且可用於創建委托或表達式目錄樹類型。 所有 Lambda 表達式都使用 Lambda 運算符 =>,該運算符讀為“goes to”。該 Lambda 運算符的左邊是輸入參數(如果有),右邊包含表達式或語句塊。
說了這么多,開始上代碼。
方法一:擴展方法與反射實現 DataTable 轉 List<T>
public static List<T> ToList<T>(this DataTable dt) where T:class,new() { Type t=typeof(T); PropertyInfo[] propertys = t.GetProperties(); List<T> lst = new List<T>(); string typeName = string.Empty; foreach (DataRow dr in dt.Rows) { T entity = new T(); foreach (PropertyInfo pi in propertys) { typeName = pi.Name; if (dt.Columns.Contains(typeName)) { if (!pi.CanWrite) continue; object value = dr[typeName]; if (value == DBNull.Value) continue; if (pi.PropertyType == typeof(string)) { pi.SetValue(entity,value.ToString(),null); } else if (pi.PropertyType == typeof(int) || pi.PropertyType == typeof(int?)) { pi.SetValue(entity,int.Parse(value.ToString()), null); } else if (pi.PropertyType == typeof(DateTime?) || pi.PropertyType == typeof(DateTime)) { pi.SetValue(entity, DateTime.Parse(value.ToString()), null); } else if (pi.PropertyType == typeof(float)) { pi.SetValue(entity, float.Parse(value.ToString()), null); } else if (pi.PropertyType == typeof(double)) { pi.SetValue(entity, double.Parse(value.ToString()), null); } else { pi.SetValue(entity,value, null); } } } lst.Add(entity); } return lst; }
方法一調用
(1)首先創建一個實體類
public class People { public string Name { get; set; } public int Age{get;set;} }
(2)調用
DataTable dt = new DataTable(); dt.Columns.Add("Name"); dt.Columns.Add("Age"); DataRow dr = dt.NewRow(); dr[0] = "eric"; dr[1] = 20; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = "eric1"; dr[1] = 22; dt.Rows.Add(dr); List<People> p = dt.ToList<People>();
方法二:擴展方法與Action委托實現數組的遍歷操作(ForEach)
public static void ForEach<T>(this IEnumerable<T> ien,Action<T> express) { foreach (var item in ien) { express(item); } }
方法二調用
List<string> lst = new List<string>(); var arr = new string[3] { "eric01", "eric02", "eric03" }; arr.ForEach(it => lst.Add(it));//這里面可以做更復雜的處理 Response.Write(lst[0]);
方法三:利用方法一和方法二實現List<t>轉換DataTable
public static DataTable ToDataTable<T>(this IEnumerable<T> value) where T : class,new() { List<PropertyInfo> lstProperty = new List<PropertyInfo>(); Type type=typeof(T); DataTable dt = new DataTable(); type.GetProperties().ForEach(p => //ForEach擴展方法,這里使用Array.ForEach(type.GetProperties(),p=>{})也是一樣 { lstProperty.Add(p); if (p.PropertyType.IsGenericType)//是否為泛型,泛型獲取不到具體的類型 { dt.Columns.Add(p.Name); } else { dt.Columns.Add(p.Name,p.PropertyType); } }); if (value != null) { foreach (var item in value) { //創建一個DataRow實例 DataRow row = dt.NewRow(); lstProperty.ForEach(p => { row[p.Name] = p.GetValue(item, null); }); dt.Rows.Add(row); } } return dt; }
OK了 今天就到此為止了,睡覺嘍。每天學習一點點,每天進步一點點。