当前位置: 首页 > news >正文

DataTable转实体类

/// <summary>
    /// DataTable与实体类互相转换
    /// </summary>
    /// <typeparam name="T">实体类</typeparam>
    public class ModelHandler<T> where T : new()
    {
        #region DataTable转换成实体类

        /// <summary>
        /// 填充对象列表:用DataSet的第一个表填充实体类
        /// </summary>
        /// <param name="ds">DataSet</param>
        /// <returns></returns>
        public List<T> FillModel(DataSet ds)
        {
            if (ds == null || ds.Tables[0] == null || ds.Tables[0].Rows.Count == 0)
            {
                return null;
            }
            else
            {
                return FillModel(ds.Tables[0]);
            }
        }

        /// <summary>  
        /// 填充对象列表:用DataSet的第index个表填充实体类
        /// </summary>  
        public List<T> FillModel(DataSet ds, int index)
        {
            if (ds == null || ds.Tables.Count <= index || ds.Tables[index].Rows.Count == 0)
            {
                return null;
            }
            else
            {
                return FillModel(ds.Tables[index]);
            }
        }

        /// <summary>  
        /// 填充对象列表:用DataTable填充实体类
        /// </summary>  
        public List<T> FillModel(DataTable dt)
        {
            if (dt == null || dt.Rows.Count == 0)
            {
                return null;
            }
            List<T> modelList = new List<T>();
            foreach (DataRow dr in dt.Rows)
            {
                //T model = (T)Activator.CreateInstance(typeof(T));  
                T model = new T();
                for (int i = 0; i < dr.Table.Columns.Count; i++)
                {
                    PropertyInfo propertyInfo = model.GetType().GetProperty(dr.Table.Columns[i].ColumnName);
                    if (propertyInfo != null && dr[i] != DBNull.Value)
                        propertyInfo.SetValue(model, dr[i], null);
                }

                modelList.Add(model);
            }
            return modelList;
        }

        /// <summary>  
        /// 填充对象:用DataRow填充实体类
        /// </summary>  
        public T FillModel(DataRow dr)
        {
            if (dr == null)
            {
                return default(T);
            }

            //T model = (T)Activator.CreateInstance(typeof(T));  
            T model = new T();

            for (int i = 0; i < dr.Table.Columns.Count; i++)
            {
                PropertyInfo propertyInfo = model.GetType().GetProperty(dr.Table.Columns[i].ColumnName);
                if (propertyInfo != null && dr[i] != DBNull.Value)
                    propertyInfo.SetValue(model, dr[i], null);
            }
            return model;
        }

        #endregion

        #region 实体类转换成DataTable

        /// <summary>
        /// 实体类转换成DataSet
        /// </summary>
        /// <param name="modelList">实体类列表</param>
        /// <returns></returns>
        public DataSet FillDataSet(List<T> modelList)
        {
            if (modelList == null || modelList.Count == 0)
            {
                return null;
            }
            else
            {
                DataSet ds = new DataSet();
                ds.Tables.Add(FillDataTable(modelList));
                return ds;
            }
        }

        /// <summary>
        /// 实体类转换成DataTable
        /// </summary>
        /// <param name="modelList">实体类列表</param>
        /// <returns></returns>
        public DataTable FillDataTable(List<T> modelList)
        {
            if (modelList == null || modelList.Count == 0)
            {
                return null;
            }
            DataTable dt = CreateData(modelList[0]);

            foreach (T model in modelList)
            {
                DataRow dataRow = dt.NewRow();
                foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())
                {
                    object drValue = propertyInfo.GetValue(model, null);

                    dataRow[propertyInfo.Name] = drValue == null ? DBNull.Value : drValue;
                }
                dt.Rows.Add(dataRow);
            }
            return dt;
        }

        /// <summary>
        /// 根据实体类得到表结构
        /// </summary>
        /// <param name="model">实体类</param>
        /// <returns></returns>
        private DataTable CreateData(T model)
        {
            DataTable dataTable = new DataTable(typeof(T).Name);
            foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())
            {
                dataTable.Columns.Add(new DataColumn(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType));
            }
            return dataTable;
        }

        #endregion
    }

  

转载于:https://www.cnblogs.com/XuPengLB/p/10172439.html

相关文章:

  • [Java][Android][Process] ProcessBuilder与Runtime差别
  • NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成...
  • 服务器虚拟化的十大谎言
  • cacti找不到网卡的解决方法
  • Java并发3:线程
  • 技术部门怎么年终考核最合理?
  • python机器学习实战(二)
  • 生成验证码
  • 【Spring Boot】19.集成消息
  • Visio2010建立ER图并直接导出为SQL语句
  • tomcat架构分析和源码解读
  • 2015博客升级记(五):CentOS 7.1编译安装PHP7
  • Git的一些常用操作
  • 正确配置jstl的maven依赖,jar包冲突的问题终于解决啦
  • Java开发集合定义及案例详解
  • 【EOS】Cleos基础
  • 3.7、@ResponseBody 和 @RestController
  • Effective Java 笔记(一)
  • Git的一些常用操作
  • GraphQL学习过程应该是这样的
  • HTML中设置input等文本框为不可操作
  • JavaScript函数式编程(一)
  • mysql innodb 索引使用指南
  • Vue全家桶实现一个Web App
  • 笨办法学C 练习34:动态数组
  • 成为一名优秀的Developer的书单
  • 番外篇1:在Windows环境下安装JDK
  • 分布式熔断降级平台aegis
  • 简单基于spring的redis配置(单机和集群模式)
  • 驱动程序原理
  • 如何利用MongoDB打造TOP榜小程序
  • 软件开发学习的5大技巧,你知道吗?
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 算法-插入排序
  • 为什么要用IPython/Jupyter?
  • 无服务器化是企业 IT 架构的未来吗?
  • Prometheus VS InfluxDB
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #14vue3生成表单并跳转到外部地址的方式
  • #laravel 通过手动安装依赖PHPExcel#
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #每日一题合集#牛客JZ23-JZ33
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • **CI中自动类加载的用法总结
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net 路由处理厉害了
  • @GetMapping和@RequestMapping的区别
  • [100天算法】-实现 strStr()(day 52)
  • [2023-年度总结]凡是过往,皆为序章