首页 > 其他分享 >DataTable转泛型集合

DataTable转泛型集合

时间:2023-03-01 14:44:29浏览次数:32  
标签:info System 转泛 var static 集合 dt DataTable

using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;

namespace BT.Preservation.Models
{
    public static class ExtendMethod
    {
       /// <summary>
        /// DataTable转成List
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static List<T> ToDataList<T>(this DataTable dt)
        {
            var list = new List<T>();
            var plist = new List<PropertyInfo>(typeof(T).GetProperties());
            foreach (DataRow item in dt.Rows)
            {
                T s = Activator.CreateInstance<T>();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName);
                    if (info != null)
                    {
                        try
                        {
                            if (!Convert.IsDBNull(item[i]))
                            {
                                object v = null;
                                if (info.PropertyType.ToString().Contains("System.Nullable"))
                                {
                                    v = Convert.ChangeType(item[i], Nullable.GetUnderlyingType(info.PropertyType));
                                }
                                else
                                {
                                    v = Convert.ChangeType(item[i],info.PropertyType);
                                }
                                info.SetValue(s, v, null);
                            }
                        }
                        catch (Exception ex)
                        {
                            throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message);
                        }
                    }
                }
                list.Add(s);
            }
            return list;
        }

        /// <summary>
        /// DataTable转成Dto
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static T ToDataDto<T>(this DataTable dt)
        {
            T s = Activator.CreateInstance<T>();
            if (dt == null || dt.Rows.Count == 0)
            {
                return s;
            }
            var plist = new List<PropertyInfo>(typeof(T).GetProperties());
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName);
                if (info != null)
                {
                    try
                    {
                        if (!Convert.IsDBNull(dt.Rows[0][i]))
                        {
                            object v = null;
                            if (info.PropertyType.ToString().Contains("System.Nullable"))
                            {
                                v = Convert.ChangeType(dt.Rows[0][i], Nullable.GetUnderlyingType(info.PropertyType));
                            }
                            else
                            {
                                v = Convert.ChangeType(dt.Rows[0][i], info.PropertyType);
                            }
                            info.SetValue(s, v, null);
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message);
                    }
                }
            }
            return s;
        }

        /// <summary>
        /// 将实体集合转换为DataTable
        /// </summary>
        /// <typeparam name="T">实体类型</typeparam>
        /// <param name="entities">实体集合</param>
        public static DataTable ToDataTable<T>(List<T> entities)
        {
            var result = CreateTable<T>();
            FillData(result, entities);
            return result;
        }

        /// <summary>
        /// 创建表
        /// </summary>
        private static DataTable CreateTable<T>()
        {
            var result = new DataTable();
            var type = typeof(T);
            foreach (var property in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
            {
                var propertyType = property.PropertyType;
                if ((propertyType.IsGenericType) && (propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                    propertyType = propertyType.GetGenericArguments()[0];
                result.Columns.Add(property.Name, propertyType);
            }
            return result;
        }

        /// <summary>
        /// 填充数据
        /// </summary>
        private static void FillData<T>(DataTable dt, IEnumerable<T> entities)
        {
            foreach (var entity in entities)
            {
                dt.Rows.Add(CreateRow(dt, entity));
            }
        }

        /// <summary>
        /// 创建行
        /// </summary>
        private static DataRow CreateRow<T>(DataTable dt, T entity)
        {
            DataRow row = dt.NewRow();
            var type = typeof(T);
            foreach (var property in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
            {
                row[property.Name] = property.GetValue(entity) ?? DBNull.Value;
            }
            return row;
        }
    }
}

  

标签:info,System,转泛,var,static,集合,dt,DataTable
From: https://www.cnblogs.com/FanJunCheng521/p/17168107.html

相关文章

  • Map集合
    Map集合packageMap_test.Map_01;importjava.util.HashMap;importjava.util.Map;publicclassMapDemo_1{publicstaticvoidmain(String[]args){......
  • 得分最高的单词集合
    题目你将会得到一份单词表words,一个字母表letters(可能会有重复字母),以及每个字母对应的得分情况表score。请你帮忙计算玩家在单词拼写游戏中所能获得的「最高得分」:能......
  • DataTable的行列转换及多表头HTML表格转Excel
    需要解决的问题:1、根据数据库中多个不同字段名称的以行形式表现的数据转为以列形式展现的数据;2、HTML多表头数据展示,做到数据“一个萝卜一个坑”,并求出多条数据的合计数据。......
  • 01 集合
    #1、作用#1.1关系运算#friends1=["zero","kevin","jason","egon"]#friends2=["Jy","ricky","jason","egon"]##l=[]#forxinfriends1:#ifxinfriends2:......
  • JSONArray与List集合之间的相互转换
    1.List转fastjsonJSONArrayListlist=newArrayList();JSONArrayjsonArray=JSONArray.parseArray(JSONArray.toString()); 2.fastjsonJSONArray转ListJSONA......
  • 02_14_Java语音进阶||day14_Java基础小节练习(1-4部分)Collection集合、File类&递归&F
    第一部分Collection集合1.1请简述集合框架解答:集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map。Collection:单列集合类......
  • 02_03_Java语音进阶||day03_数据结构(集合相关)、List、Set、可变参数、Collections工具
    第一章数据结构1.1数据结构的作用Java是面向对象的语音,好似自动挡汽车,c语音手动挡,数据结构?数据结构:是变速箱的工作原理。你完全可以不懂变速箱怎样工作,就可以把自动挡车从......
  • MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(3)-系统数据集合设计
    前言前几章教程我们把ToDoList系统的基本框架搭建好了,现在我们需要根据我们的需求把ToDoList系统所需要的系统集合(相当于关系型数据库中的数据库表)。接下来我们先简单......
  • 集合 Set方法
     set方法可以去重数组//声明一个setlete=newSet()letess=newSet(['张三','李四','王五','李四'])console.log(ess);   ......
  • set 集合实践
     <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>set集合实践</title></head><body><divid="ad"></div><div></div><script>le......