平时做业务设计的时候,总是离不了建立各种实体模型Model,但一般这些模型都需要从查询结果DataTable生成,
一般的写法是:为每一个模型编写一个方法,实现DataTable到Model的转换。
但这个方法有一些问题:
(1)工作效率低:要为每个属性编写赋值语句,工作重复。
(2)代码重用性差:不同的类有不同的属性,这个Model转换不能够用于另一个Model的转换
(3)DataTable字段检测费力:每一次属性赋值都要写个判断,以确定这个Field字段是否存在,它的值是否是否合法,检测费力
解决:利用反射和泛型,写一个通用类,实现这个转换过程。(下面是网上找的代码,是正确的。这个方法我自己也写了,只是没别人写的规范,就拿别人的用用吧)
View Code
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Data; 5 using System.Reflection; 6 namespace NCL.Data 7 { 8 /// <summary> 9 /// 实体转换辅助类 10 /// </summary> 11 public class ModelConvertHelper<T> where T : new() 12 { 13 public static IList<T> ConvertToModel(DataTable dt) 14 { 15 // 定义集合 16 IList<T> ts = new List<T>(); 17 // 获得此模型的类型 18 Type type = typeof(T); 19 string tempName = ""; 20 foreach (DataRow dr in dt.Rows) 21 { 22 // 获得此模型的公共属性 23 PropertyInfo[] propertys = t.GetType().GetProperties(); 24 foreach (PropertyInfo pi in propertys) 25 { tempName = pi.Name; 26 // 检查DataTable是否包含此列 27 if (dt.Columns.Contains(tempName)) 28 { 29 // 判断此属性是否有Setter 30 if (!pi.CanWrite) continue; 31 object value = dr[tempName]; 32 if (value != DBNull.Value) 33 pi.SetValue(t, value, null); 34 } 35 } 36 ts.Add(t); 37 } 38 return ts; 39 } 40 } 41 } 42 43 //示例: 44 // 获得查询结果 45 DataTable dt = DbHelper.ExecuteDataTable(...); 46 // 把DataTable转换为IList<UserInfo> 47 IList<UserInfo> users = ModelConvertHelper<UserInfo>.ConvertToModel(dt);