反射实例-DataTable 转 List

1.新建一个控制台程序

2.在控制台程序新建一个Student.cs 实体类

public class Student
{
        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public DateTime? AddTime { get; set; }
}

3.新建一个静态类(ExtendClass.cs),用于实现数据转换

public static class ExtendClass
{
        public static List<T> ToModel<T>(this DataTable dt)
        {
            List<T> list = new List<T>();
            foreach (DataRow dr in dt.Rows)
            {
                T t = Activator.CreateInstance<T>();
                var properties = t.GetType().GetProperties();
                foreach (var property in properties)
                {
                    //判断列是否存在
                    if (dt.Columns.Contains(property.Name))
                    {
                        var value = dr[property.Name];
                        try
                        {
                            //判断value是否为null
                            if (!Convert.IsDBNull(value))
                            {
                                //用于判断属性是否可谓null,如:public DateTime? AddTime { get; set; }
                                if (property.PropertyType.ToString().Contains("System.Nullable`1"))
                                {
                                    property.SetValue(t, Convert.ChangeType(value, Nullable.GetUnderlyingType(property.PropertyType)), null);
                                }
                                else
                                {
                                    property.SetValue(t, Convert.ChangeType(value, property.PropertyType), null);
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            throw new Exception($"属性名称:{property.Name} 转换类型出错,值为:{value}");
                        }
                    }
                }
                list.Add(t);
            }
            return list;
        }
}

4.在控制台调用方法

static void Main(string[] args)
{
            DataTable dt = new DataTable();
            //新增列
            dt.Columns.Add("ID");
            dt.Columns.Add("Name");
            dt.Columns.Add("Age");
            dt.Columns.Add("AddTime");
            for (int i = 0; i < 10; i++)
            {
                DataRow dr = dt.NewRow();
                dr["ID"] = i;
                dr["Name"] = "张三" + i;
                dr["Age"] = 18 + i;
                dr["AddTime"] = (i % 2 == 0) ? dr["AddTime"] = DateTime.Now.AddDays(i) : dr["AddTime"] = null;
                dt.Rows.Add(dr);
            }
            var students = dt.ToModel<Student>();
}
将来的你,一定会感谢现在努力的自己!
原文地址:https://www.cnblogs.com/GreatPerson/p/13577419.html