記得在學校的時候,接觸得最多的就是SqlHelper,每次在讀取的時候不管是DataTable還是DataReader轉換為實體對象的時候是最惱火的,因為要寫很多代碼,而且沒有什麼意義。後面接觸到了反射,於是查了下資料也寫了個已經爛大街的DataTable轉換為Model實體對象
1 public static IEnumerable<T> DataTableToModels<T>(this DataTable dt) where T : class, new()
2 {
3 //判斷datatable是否有值
4 if (dt.Columns.Count < 1 || dt.Rows.Count < 1) yield return default(T);
5 //獲取實體類中所有公開的屬性,並且篩選出在datatable中存在的列
6 var propertyInfos = from propertyInfo in typeof(T).GetProperties()
7 where dt.Columns.Contains(propertyInfo.Name)
8 select propertyInfo;
9 //循環設置屬性
10 foreach (DataRow dr in dt.Rows)//遍歷dt中所有行
11 {
12 var result = new T();
13 foreach (var p in propertyInfos)//遍歷所有屬性
14 {
15 try
16 {
17 p.SetValue(result, dr[p.Name], null);
18 }
19 catch (System.Exception)
20 {
21
22 throw;
23 }
24 }
25 yield return result;
26 }
27
28 }
需要注意的是DataTable.Columns.Contains和賦值給定Name時是不區分大小寫的!