• 使用反射将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         }
  • 相关阅读:
    [BZOJ1620][Usaco2008 Nov]Time Management 时间管理
    [BZOJ1634][Usaco2007 Jan]Protecting the Flowers 护花
    [BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排
    [BZOJ1708][Usaco2007 Oct]Money奶牛的硬币
    [BZOJ1690][Usaco2007 Dec]奶牛的旅行
    fzu 2132 LQX的作业
    fzu 2139 久违的月赛之二
    poj 1849 Two 树形dp
    师范大学 e: skyscrapers
    O(∩_∩)O~~
  • 原文地址:https://www.cnblogs.com/linJie1930906722/p/5555928.html
Copyright © 2020-2023  润新知