zoukankan      html  css  js  c++  java
  • 反射实例-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>();
    }
    将来的你,一定会感谢现在努力的自己!
  • 相关阅读:
    Python实现DES加密算法
    空循环,g++ O2优化
    java 高并发下超购问题解决
    原型模式
    Lambda速学
    观察者模式
    略读策略模式
    .net 字典的速学
    执行计划准备篇
    关于“策略模式”与“桥接模式”的问题
  • 原文地址:https://www.cnblogs.com/GreatPerson/p/13577419.html
Copyright © 2011-2022 走看看