首页 > 编程语言 >C#使用泛型方法将Datatable转换成List对象集合

C#使用泛型方法将Datatable转换成List对象集合

时间:2023-07-13 15:25:18浏览次数:51  
标签:info parsedDate C# List value ToString 泛型 property dr

 在项目中遇到需要将Datatable转换成对象的需求,通过dr[0]取下标这种获取,如果数据的顺序发生了改变则需要改变全部,工作量大

foreach (DataRow dr in dt.Rows)
            {
                CheckDetail info = new CheckDetail();
                info.org_id = dr[0].ToString();
                info.am_line_id = dr[1].ToString();
                info.component = dr[2].ToString();
                info.standard = dr[3].ToString();
                info.frequency = dr[4].ToString();
                info.status_code = dr[5].ToString();
                info.status_name = dr[6].ToString();
                info.activity_type = dr[7].ToString();
                info.activity_type_name = dr[8].ToString();
                info.check_results = dr[9].ToString();
                info.remark = dr[10].ToString();
                info.creation_date = FrameWork.ToDateTimeWithNull(dr[11].ToString());
                info.created_by = dr[12].ToString();
                info.last_updated_date = FrameWork.ToDateTimeWithNull(dr[13].ToString());
                info.last_updated_by = dr[14].ToString();
                info.am_head_id = dr[15].ToString();
                info.check = dr[16].ToString();
                info.Seq = Seq;
                list.Add(info);
                Seq++;
            }

 

如果采用dr["columnName"]取列名的方式,一旦数据字段多了,工作量同样不小

foreach (DataRow dr in dt.Rows)
            {
                DeviceInfo info = new DeviceInfo();
                info.Line_ID = dr["LINE_ID"].ToString();
                info.Resource_ID = dr["RESOURCE_ID"].ToString();
                info.Item_ID = dr["ITEM_ID"].ToString();
                info.Item_Desc = dr["ITEM_DESC"].ToString();
                info.Uom = dr["UOM"].ToString();
                info.Desc = dr["DESCRIPTIONS"].ToString();
                info.Avail_Qty = dr["AVAIL_QTY"].ToString();
                info.Lot_Qty = dr["LOT_QTY"].ToString();
                info.Flag = Convert.ToInt32(dr["FLAG"].ToString());
                info.Plan_Flag = Convert.ToInt32(dr["PLAN_FLAG"].ToString());
                info.Item_Code = dr["ITEM_CODE"].ToString();
                info.Flag_Result = info.Flag == 1 ? true : false;
                info.Plan_Flag_Result = info.Plan_Flag == 1 ? true : false; 
                list.Add(info); 
            }

 

所以才有了通过泛型+反射的这种方式

        /// <summary>
        /// 将Datatable数据转换成实体对象集合
        /// </summary>
        /// <typeparam name="T">对象</typeparam>
        /// <param name="dt">Datatable数据</param>
        /// <returns></returns>
        public List<T> ConvertDataTableToList<T>(DataTable dt) where T : new()
        {
            List<T> list = new List<T>();

            foreach (DataRow row in dt.Rows)
            {
                T obj = new T();

                foreach (DataColumn column in dt.Columns)
                {
                    string columnName = column.ColumnName;
                    PropertyInfo property = typeof(T).GetProperty(columnName, BindingFlags.Public | BindingFlags.Instance);

                    if (property != null && row[columnName] != DBNull.Value)
                    {
                        if (property.PropertyType == typeof(DateTime?))
                        {
                            DateTime? value = null;
                            string dateString = row[columnName].ToString();
                            DateTime parsedDate;

                            if (DateTime.TryParse(dateString, out parsedDate))
                            {
                                value = parsedDate;
                            }
                            property.SetValue(obj, value);
                        }
                        else if (property.PropertyType == typeof(int?))
                        {
                            int? value = null;
                            string dateString = row[columnName].ToString();
                            int parsedDate;

                            if (int.TryParse(dateString, out parsedDate))
                            {
                                value = parsedDate;
                            }
                            property.SetValue(obj, value);
                        }
                        else if (property.PropertyType == typeof(bool?))
                        {
                            bool? value = null;
                            string dateString = row[columnName].ToString();
                            bool parsedDate;

                            if (bool.TryParse(dateString, out parsedDate))
                            {
                                value = parsedDate;
                            }
                            property.SetValue(obj, value);
                        }
                        else
                        {
                            object value = Convert.ChangeType(row[columnName], property.PropertyType);
                            property.SetValue(obj, value);
                        }
                    }
                }

                list.Add(obj);
            }

            return list;
        }

 

标签:info,parsedDate,C#,List,value,ToString,泛型,property,dr
From: https://www.cnblogs.com/wofeiliangren/p/17550545.html

相关文章

  • 【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Win
    问题描述PHP的WebJob,通过artisan来配置路径启动PHP任务,相关启动脚本如下:artisan_path="d:\\home\\site\\wwwroot";cd${artisan_path}echo"\n"pwdphpartisanschedule:run但是,在运行的时候遇见报错:[07/06/202301:57:31>0f21a2:INFO]/d/home/site/wwwroo......
  • 发送请求忘记指定协议方式,日志com.jcraft.jsch.JSchException: java.net.ConnectExcep
      2023-07-1319:06:51.487-ERROR17629---[http-nio-192.168.2.206-36093-exec-8]c.t.b.p.b.c.common.util.sftp.SftpPool:com.jcraft.jsch.JSchException:java.net.ConnectException:拒绝连接(Connectionrefused)_atcom.jcraft.jsch.Util.createSocket(......
  • 处理.git文件夹过大出现臃肿问题-filter-branch和BFG工具
    Git开发手册git一些不常用的命令记不住,可以查看git开发手册(https://m.php.cn/manual/view/34957.html)1、.git/objects/pack文件过大今天从git拉取项目进行开发的时候克隆的很慢,还以为是网速的问题。查看了一些git命令框的拉取网络速度发现网速也很快,克隆下来后才发现是.git文......
  • Batch、Drawcall和SetPassCall
    转自:DrawCall,Batches,SetPasscalls是什么?原理?【匠】-知乎(zhihu.com)cube使用双passshader:  cube使用同材质,同shader,不勾选static:完全不合批,batch:基础的2个batch+6个cube*2个pass,setpasscall:基础的2个batch+6个cube*2个pass   cube使用同材质,同shader,勾选st......
  • StarRocks Segment源码阅读笔记--SegmentIterator创建
    StarRocks中要读取Segment中的数据,需要先创建SegmentIteratorStatusOr<ChunkIteratorPtr>Segment::_new_iterator(constSchema&schema,constSegmentReadOptions&read_options){DCHECK(read_options.stats!=nullptr);//tryingtoprunethecurrentse......
  • ArrayList源码阅读
    ArrayList源码分析ArrayList简介ArrayList的底层是数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加ArrayList实例的容量。这可以减少递增式再分配的数量。ArrayList继承于AbstractList,实现......
  • Capture One 23-RAW图像编辑软件mac/win版
    CaptureOne23是一款专业的RAW图像编辑软件,广泛应用于摄影行业。它提供了丰富而强大的工具和功能,帮助摄影师优化、处理和管理他们的原始图像。→→↓↓载CaptureOne23mac/win版  RAW文件支持:CaptureOne23支持超过500种不同相机的原始RAW文件,包括主流相机品牌如佳能......
  • office学习笔记
    目录Excel函数使用VLOOKUP制作四象限图wordPowerPointExcel函数使用VLOOKUP使用说明:https://support.microsoft.com/zh-cn/office/vlookup-函数-0bbc8083-26fe-4963-8ab8-93a18ad188a1功能:需要在表格或区域中按行查找内容时,请使用VLOOKUP。说明:在这一最简单的形式中,VLOOK......
  • Authentication With ASP.NET Core Identity
    AuthenticationWithASP.NETCoreIdentity、PreparingtheAuthenticationEnvironmentinourProjectThefirstthing,wearegoingtodoisdisableunauthorizeduserstoaccesstheEmployeesaction.Todothat,wehavetoaddthe[Authorize]attributeonto......
  • react-d3-tree自定义节点使用案例
    react-d3-tree主要API及其中文解释:Tree组件的props:这些API提供了丰富的配置选项,可以用来定制树的外观和行为。例如,可以使用nodeSize属性调整节点的大小,使用pathFunc属性绘制自定义的连线,使用onClick属性处理节点的点击事件等等。data:树的数据对象。zoomable:指......