C# DataTable 转换成List<T>

运用泛型和反射实现的转换,很给力。代码中掺杂详尽注释,稍微了解一下泛型和反射便可以了解转换的实质。可以直接复制粘贴进行调用哦。

public class DtConverToList<T> where T : new()
{
    public static List<T> DtToList(DataTable dt)
    {
        //定义集合
        List<T> ListCollection = new List<T>(dt.Rows.Count);
        //获得 T 模型类型
        Type T_type = typeof(T);
        //获得 T 模型类型公共属性
        PropertyInfo[] Proper = T_type.GetProperties();
        //临时变量,存储变量模型公共属性Name
        string Tempname = "";
        //遍历参数 DataTable的每行
        foreach (DataRow Dr in dt.Rows)
        {
            //实例化 T 模版类
            T t = new T();
            //遍历T 模版类各个属性
            #region
            foreach (PropertyInfo P in Proper)
            {
                //取出类属性之一
                Tempname = P.Name;
                //判断DataTable中是否有此列
                if (dt.Columns.Contains(Tempname))
                {
                    //判断属性是否可写属性
                    if (!P.CanWrite)
                    {
                        continue;
                    }
                    try
                    {
                        //得到Datable单元格中的值
                        object value = Dr[Tempname];
                        //得到 T 属性类型
                        Type ProType = P.PropertyType;
                        //判断类型赋值
                        if (value != DBNull.Value)
                        {
                            //
                            if (value.GetType() == ProType)
                            {
                                P.SetValue(t, value, null);
                            }
                            else
                            {
                                if (ProType == typeof(string))
                                {
                                    string Temp = value.ToString();
                                    P.SetValue(t, Temp, null);
                                }
                                else if (ProType == typeof(byte))
                                {
                                    byte Temp = Convert.ToByte(value);
                                    P.SetValue(t, Temp, null);
                                }
                                else if (ProType == typeof(short))
                                {
                                    short Temp = short.Parse(value.ToString());
                                    P.SetValue(t, Temp, null);
                                }
                                else if (ProType == typeof(long))
                                {
                                    long Temp = long.Parse(value.ToString());
                                    P.SetValue(t, Temp, null);
                                }
 
                                else if (ProType == typeof(Int64))
                                {
                                    Int64 Temp = Convert.ToInt64(value);
                                    P.SetValue(t, Temp, null);
                                }
                                else if (ProType == typeof(Int32))
                                {
                                    Int32 Temp = Convert.ToInt32(value);
                                    P.SetValue(t, Temp, null);
                                }
                                else if (ProType == typeof(Int16))
                                {
                                    Int16 Temp = Convert.ToInt16(value);
                                    P.SetValue(t, Temp, null);
                                }
                                else
                                {
                                    object Temp = Convert.ChangeType(value, ProType);
                                    P.SetValue(t, Temp, null);
                                }
                            }
                        }
                    }
                    catch (Exception)
                    {
 
                        throw;
                    }
                }
            }
            #endregion
            ListCollection.Add(t);
        }
        return ListCollection;
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

ruby学习笔记(3)--语法层面的先见之明

看了几天ruby,发现c#中很多一直被称道的语法特性,ruby早在几年前就有了:  1.c#中的params关键字 class Program ...

23050
来自专栏GreenLeaves

C#核编之X++详解

重点:当X++单独使用时,就是没有其他符号参与运算,这时X做自增运算,而当X++与其他运算符一起参与运算时,这时的X++因为运算优先级低,所以是最后一个参与运算...

22450
来自专栏魂祭心

原 二叉树 非递归 层序、前序、中序、后序

32440
来自专栏函数式编程语言及工具

Scalaz(45)- concurrency :Task-函数式多线程编程核心配件

    我们在上一节讨论了scalaz Future,我们说它是一个不完善的类型,最起码没有完整的异常处理机制,只能用在构建类库之类的内部环境。如果scalaz...

30260
来自专栏angularejs学习篇

c#中jeson字符串和OBJECT对象的相互转换

说明:首先,当然是项目是3.5+的;必须添加引用:System.Runtime.Serialization 和 System.ServiceModel

45520
来自专栏菩提树下的杨过

linq学习笔记(一)

本例演示了如何从一个int数组中找出偶数,并将结果从大小到排序 using System; using System.Collections.Generic;...

206100
来自专栏菩提树下的杨过

Linq之ToDictionary<TSource, TKey, TElement>的写法

以前一直用 var query = xxx.Select(c=>new {c.X,c.Y}); 来取表中的某二列字段,今天有个应用需要转成Dictionary<...

233100
来自专栏知识分享

C#函数重载

先看两个函数 void test(int i); void test(string str); 这就是多态 using System; using System...

27840
来自专栏魂祭心

原 (手工)base64加密解密

39760
来自专栏Java成神之路

Java_数据交换_fastJSON_01_用法入门

9620

扫码关注云+社区

领取腾讯云代金券