使用反射将DataTable的数据转成实体类
利用反射避免了硬编码出现的错误,但是实体类的属性名必须和数据库名字对应(相同)
1、利用反射把DataTable的数据写到单个实体类
/// <summary> ///利用反射把DataTable的数据写到单个实体类 /// </summary> /// <typeparam name="T">实体类(model)</typeparam> /// <param name="dtSource">DataTable数据源</param> /// <returns>返回的实体类对象</returns> public static T ToSingleEntity<T>(this System.Data.DataTable dtSource) where T : class, new() { if (dtSource == null) { return default(T); } if (dtSource.Rows.Count != 0) { Type type = typeof(T); Object entity = Activator.CreateInstance(type); //创建实例 foreach (System.Reflection.PropertyInfo entityCols in type.GetProperties()) { if (!string.IsNullOrEmpty(dtSource.Rows[0][entityCols.Name].ToString())) { Type valType = entityCols.PropertyType; if (valType.IsGenericType && valType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))//判断convertsionType是否为nullable泛型类 { //如果type为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换 System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(valType); //将type转换为nullable对的基础基元类型 valType = nullableConverter.UnderlyingType; } entityCols.SetValue(entity, Convert.ChangeType(dtSource.Rows[0][entityCols.Name], valType), null); //entityCols.SetValue(entity, dtSource.Rows[0][entityCols.Name], null); } } return (T)entity; } return default(T); }
2、利用反射把DataTable的数据写到集合实体类里
1 /// <summary> 2 /// 利用反射把DataTable的数据写到集合实体类里 3 /// </summary> 4 /// <typeparam name="T">实体类(model)</typeparam> 5 /// <param name="dtSource">DataTable数据源</param> 6 /// <returns>返回IEnumerable的实体类对象</returns> 7 public static IEnumerable<T> ToListEntity<T>(this System.Data.DataTable dtSource) where T : class, new() 8 { 9 if (dtSource == null) 10 { 11 return null; 12 } 13 14 List<T> list = new List<T>(); 15 Type type = typeof(T); 16 foreach (System.Data.DataRow dataRow in dtSource.Rows) 17 { 18 Object entity = Activator.CreateInstance(type); //创建实例 19 foreach (System.Reflection.PropertyInfo entityCols in type.GetProperties()) 20 { 21 if (!string.IsNullOrEmpty(dataRow[entityCols.Name].ToString())) 22 { 23 Type valType = entityCols.PropertyType; 24 if (valType.IsGenericType && valType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))//判断convertsionType是否为nullable泛型类 25 { 26 //如果type为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换 27 System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(valType); 28 //将type转换为nullable对的基础基元类型 29 valType = nullableConverter.UnderlyingType; 30 } 31 entityCols.SetValue(entity, Convert.ChangeType(dataRow[entityCols.Name], valType), null); 32 } 33 } 34 list.Add((T)entity); 35 } 36 return list; 37 }
用法:
1 static void Main(string[] args) 2 { 3 System.Data.DataSet ds = new System.Data.DataSet(); 4 IEnumerable<User> model = ds.Tables[0].ToListEntity<User>(); 5 }