DataTable转成List

本文介绍了一种将DataTable转换为List的C#方法,通过定义转换类和泛型方法,实现不同类型数据的自动转换,适用于多种数据类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DataTable转成List 

//把一个Datatable 赋值给一个List对象

//定义一个转换类

 public class ConvertTool
    {
        public static List<T> DataConvert<T>(DataTable tb)
        {
            List<T> lst = new List<T>();
            DataConvert<T>(tb, ref lst);
            return lst;
        }
      

        public static List<T> DataConvert<T>(DataTable tb, ref List<T> lst)
        {
            for (int i = 0; i < tb.Rows.Count; i++)
            {
                lst.Add(DataConvert<T>(tb.Rows[i]));
            }
            return lst;
        }
        public static T DataConvert<T>(DataRow row)
        {
            var type = typeof(T);
            object obj = type.Assembly.CreateInstance(type.FullName);
            var c = (T)obj;
            DataConvert(row, ref c);
            return c;
        }

        public static T DataConvert<T>(DataRow row, ref T t)
        {
            var ps = t.GetType().GetProperties();
            var tbColumns = row.Table.Columns;
            foreach (var c in ps)
            {
                var colName = c.Name;
                if (tbColumns.Contains(colName))
                {
                    object nr = row[colName] == DBNull.Value ? null : row[colName];
                    if (nr == null)
                    {
                        c.SetValue(t, nr, null);
                    }
                    else
                    {
                        var nrType = c.PropertyType;
                        if (nrType == typeof(decimal) || nrType == typeof(decimal?))
                        {
                            nr = Convert.ToDecimal(nr);
                        }
                        else if (nrType == typeof(Int64) || nrType == typeof(Int64?))
                        {
                            nr = Convert.ToInt64(nr);
                        }
                        else if (nrType == typeof(double) || nrType == typeof(double?))
                        {
                            nr = Convert.ToDouble(nr);
                        }
                        else if (nrType == typeof(Int32) || nrType == typeof(Int32?))
                        {
                            nr = Convert.ToInt32(nr);
                        }
                        else if (nrType == typeof(Int16) || nrType == typeof(Int16?))
                        {
                            nr = Convert.ToInt16(nr);
                        }
                        c.SetValue(t, nr, null);
                    }

                }
            }
            return t;
        }
    }

定义一个测试的实体类 

多种类型全部用上

  public class TestClass
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Money { get; set; }
        public bool IsValid { get; set; }
        public DateTime BirthDay { get; set; }

    }

 方法调用及显示结果

    public class Program
    {
        static void Main(string[] args)
        {
            //定义一个DataTable 并赋值
            DataTable dt = new DataTable("dtTest");
            DataColumn dc = null;
            dc = dt.Columns.Add("Id", Type.GetType("System.Int32"));
            dc = dt.Columns.Add("Name", Type.GetType("System.String"));
            dc = dt.Columns.Add("Money", Type.GetType("System.Decimal"));
            dc = dt.Columns.Add("IsValid", Type.GetType("System.Boolean"));
            dc = dt.Columns.Add("BirthDay", Type.GetType("System.DateTime"));
            DataRow newRow;
            newRow = dt.NewRow();
            newRow["Id"] = "1";
            newRow["Name"] = "测试1";
            newRow["IsValid"] = true;
            newRow["Money"] = 100.00m;
            newRow["BirthDay"] = DateTime.Now ;
            dt.Rows.Add(newRow);

            newRow = dt.NewRow();
            newRow["Id"] = "2";
            newRow["Name"] = "测试2";
            newRow["IsValid"] = true;
            newRow["Money"] = 100.00m;
            newRow["BirthDay"] = DateTime.Now;
            dt.Rows.Add(newRow);

            //调用DataTable转成List
            List<TestClass> Li = ConvertTool.DataConvert<TestClass>(dt); 

            

        }
    }

现在有很多流行的ORM框架,直接取出来对象数据很方便,不用再转。实现原理大同小异;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值