记得在学校的时候,接触得最多的就是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时是不区分大小写的!