記得在學校的時候,接觸得最多的就是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時是不區分大小寫的!