利用反射避免了硬编码出现的错误,但是实体类的属性名必须和数据库名字对应(相同)
1、利用反射把DataTable的数据写到单个实体类
//////利用反射把DataTable的数据写到单个实体类 /// ///实体类(model) /// DataTable数据源 ///返回的实体类对象 public static T ToSingleEntity(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 ///2 /// 利用反射把DataTable的数据写到集合实体类里 3 /// 4 ///实体类(model) 5 /// DataTable数据源 6 ///返回IEnumerable的实体类对象 7 public static IEnumerableToListEntity (this System.Data.DataTable dtSource) where T : class, new() 8 { 9 if (dtSource == null)10 {11 return null;12 }13 14 List list = new List ();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 IEnumerablemodel = ds.Tables[0].ToListEntity ();5 }