把DataTable转换为List<T>

前一篇有学习过《把List<T>转换为DataTablehttp://www.cnblogs.com/insus/p/8043173.html


那此篇,将是学习反向,把DataTable转换为List<T>。这个方法使用的较多。很多情况之后,从数据读出来的数据是DataSet或是DataTable。需要把它们转换为List<T>之后,再转换为json。

下面Insus.NET写一个扩展方法:

 

 public static List<T> ToList<T>(this DataTable dt)
        {
            var dataColumn = dt.Columns.Cast<DataColumn>().Select(c => c.ColumnName).ToList();

            var properties = typeof(T).GetProperties();
            string columnName = string.Empty;

            return dt.AsEnumerable().Select(row =>
            {
                var t = Activator.CreateInstance<T>();
                foreach (var p in properties)
                {
                    columnName = p.Name;
                    if (dataColumn.Contains(columnName))
                    {
                        if (!p.CanWrite)
                            continue;

                        object value = row[columnName];
                        Type type = p.PropertyType;

                        if (value != DBNull.Value)
                        {
                            p.SetValue(t, Convert.ChangeType(value, type), null);
                        }
                    }
                }
                return t;
            }).ToList();
        }
Source Code

 

接下来,手动创建一个DataTable,添加一些数据行。对象是引用前一篇的对象:

 

 class Ba
    {
        public void ConvertDataTableToListToTestDemo()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Account", typeof(string));
            dt.Columns.Add("Email", typeof(string));

            dt.Rows.Add(1, "A0001", "A0001@email.com");
            dt.Rows.Add(2, "A0002", "A0002@email.com");
            dt.Rows.Add(3, "A0003", "A0003@email.com");

            List<Ay> ays = dt.ToList<Ay>();

            ays.ForEach(delegate (Ay ay)
            {
                Console.WriteLine(ay.ToString());
            });
            
            Console.WriteLine("\n\r");
        }
    }
Source Code

 

上图红框即是#23行代码,就是本篇的核心代码,把DataTable转换为List<T>。

 

在控制台测试一下代码:

 

posted @ 2017-12-15 23:19  Insus.NET  阅读(845)  评论(1编辑  收藏  举报