• List泛型与DataTable相互转换


    public static class ExtensionMethods
    {
    /// <summary>
    /// 将List转换成DataTable
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="data"></param>
    /// <returns></returns>
    public static DataTable ToDataTable<T>(this IList<T> data)
    {
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
    DataTable dt = new DataTable();
    for (int i = 0; i < properties.Count; i++)
    {
    PropertyDescriptor property = properties[i];
    dt.Columns.Add(property.Name, property.PropertyType);
    }
    object[] values = new object[properties.Count];
    foreach (T item in data)
    {
    for (int i = 0; i < values.Length; i++)
    {
    values[i] = properties[i].GetValue(item);
    }
    dt.Rows.Add(values);
    }
    return dt;
    }

    /// <summary>
    /// DataTable转泛型
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="dt">DataTable</param>
    /// <returns></returns>
    public static List<T> ToList<T>(this DataTable dt) where T : class, new()
    {
    //获取类
    Type t = typeof(T);
    //反射 using System.Reflection;
    //获取当前Type的公共属性
    PropertyInfo[] propertys = t.GetProperties();
    List<T> list = new List<T>();
    //字段名称
    string typeName = string.Empty;
    //遍历DataTable每行
    foreach (DataRow dr in dt.Rows)
    {
    //创建实体
    T entity = new T();
    //遍历实体的公共属性
    foreach (PropertyInfo pi in propertys)
    {
    //将字段名称赋值
    typeName = pi.Name;
    if (dt.Columns.Contains(typeName))
    {
    //获取一个值,该值指定此属性是否可写 set 
    if (!pi.CanWrite) continue;
    //根据字段名称获取对应值
    object value = dr[typeName];
    //若不存在 则跳出
    if (value == DBNull.Value) continue;
    //获取此属性的类型是否是string类型
    if (pi.PropertyType == typeof(string))
    {
    //PropertyInfo.SetValue()三个参数
    //第一个 将设置其属性值的对象。
    //第二个 新的属性值。
    //第三个 索引化属性的可选索引值。 对于非索引化属性,该值应为 null。
    pi.SetValue(entity, value.ToString(), null);
    }
    else if (pi.PropertyType == typeof(int))
    {
    //写入
    pi.SetValue(entity, int.Parse(value.ToString()), null);
    }
    else if (pi.PropertyType == typeof(DateTime))
    {
    //写入
    pi.SetValue(entity, DateTime.Parse(value.ToString()), null);
    }
    else
    {
    pi.SetValue(entity, value, null);
    }
    }
    }
    //加入泛型末尾
    list.Add(entity);
    }
    return list;
    }
    }

  • 相关阅读:
    关于C语言变量初始化的两个问题的笔记
    源自StackOverflow:找到LIST中第一个降序成员,有助于对扩展方法、IEnumerable<T>、泛型的理解
    《PERL高效编程》学习笔记(1)【关于裸字处理】
    C#出题库项目的总结(2)
    遇到的浏览器兼容问题及应对方法
    春招面试小记
    关于团队成员的退出引发的一些回忆及感悟
    C#出题库项目的总结(1)
    写一个程序,分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的10个词打印出来
    重定向和管道符
  • 原文地址:https://www.cnblogs.com/TianxiuCode/p/10001306.html
Copyright © 2020-2023  润新知