使用反射将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         }
原文地址:https://www.cnblogs.com/linJie1930906722/p/5555928.html