• 封装一个List集合和datatable相互转换的工具类(可对指定列进行重命名并且指定输出列)


    
    
       /// <summary>
        /// List转换为DataTable对象
        /// </summary>
       public class ListTranTableModel
        {
            /// <summary>
            /// 新增的列名称
            /// </summary>
            public string addColumName { get; set; }
            /// <summary>
            /// 新增列的默认信息
            /// </summary>
            public TableCloumDInfo tableCloumDInfo { get; set; }
        }
    
    
      /// <summary>
        /// 列的默认信息
        /// </summary>
      public  class TableCloumDInfo
        {
            //列的数据类型
            public Type dataType { get; set; }
            //列的默认值
            public object defaultValue { get; set; }
        }
      /// <summary>
        /// 批量导入信息基类
        /// </summary>
        public class DatableBulk_ImportBase
        {
            /// <summary>
            /// 重命名的列集合
            /// </summary>
            public Dictionary<string, string> PropertyRenameDic { get; set; }
            /// <summary>
            /// 要指定输出的列名称
            /// </summary>
            public string[] PropertyName { get; set; }
            /// <summary>
            /// 数据类型
            /// </summary>
            public string Category { get; set; }
            /// <summary>
            /// 批量导入信息时的说明信息
            /// </summary>
            public string ErrorInfo { get; set; }
        }
        /// <summary>
        /// 批量导入信息数据Table属性操作对象
        /// </summary>
        public class DatableProperty : DatableBulk_ImportBase
        {
        }
    
    
     public static class ListTranDataTableHelper
        {
            /// <summary>    
            /// 将集合类转换成DataTable    
            /// </summary>    
            /// <param name="list">集合</param>    
            /// <returns></returns>    
            private static DataTable ToDataTableTow(IList list)
            {
                DataTable result = new DataTable();
                if (list.Count > 0)
                {
                    PropertyInfo[] propertys = list[0].GetType().GetProperties();
    
                    foreach (PropertyInfo pi in propertys)
                    {
                        result.Columns.Add(pi.Name, pi.PropertyType);
                    }
                    foreach (object t in list)
                    {
                        ArrayList tempList = new ArrayList();
                        foreach (PropertyInfo pi in propertys)
                        {
                            object obj = pi.GetValue(t, null);
                            tempList.Add(obj);
                        }
                        object[] array = tempList.ToArray();
                        result.LoadDataRow(array, true);
                    }
                }
                return result;
            }
    
            /// <summary>    
            /// DataTable 转换为List 集合    
            /// </summary>    
            /// <typeparam name="TResult">类型</typeparam>    
            /// <param name="dt">DataTable</param>    
            /// <returns></returns>    
            public static List<T> ToList<T>(this DataTable dt) where T : class, new()
            {
                //创建一个属性的列表    
                List<PropertyInfo> prlist = new List<PropertyInfo>();
                //获取TResult的类型实例  反射的入口    
                Type t = typeof(T);
    
                //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表     
                Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });
    
                //创建返回的集合    
                List<T> oblist = new List<T>();
    
                foreach (DataRow row in dt.Rows)
                {
                    //创建TResult的实例    
                    T ob = new T();
                    //找到对应的数据  并赋值    
                    prlist.ForEach(p =>
                    {
                        if (row[p.Name] != DBNull.Value)
                        {
                            //处理遇到可空类型的情况.动态反射成目标类型
                            if (!p.PropertyType.IsGenericType) p.SetValue(ob, Convert.ChangeType(row[p.Name], p.PropertyType), null);
                            else
                            {
                                Type genericTypeDefinition = p.PropertyType.GetGenericTypeDefinition();
                                if (genericTypeDefinition == typeof(Nullable<>))
                                    p.SetValue(ob, Convert.ChangeType(row[p.Name], Nullable.GetUnderlyingType(p.PropertyType)), null);
                            }
                        }
    
                    });
                    //放入到返回的集合中.    
                    oblist.Add(ob);
                }
                return oblist;
            }
    
            public static List<string> ToList(this DataTable dt)
            {
                //创建一个属性的列表    
                List<PropertyInfo> prlist = new List<PropertyInfo>();
    
                //创建返回的集合    
                List<string> oblist = new List<string>();
    
                foreach (DataRow row in dt.Rows)
                {
                    string ob = null;
                    //找到对应的数据  并赋值    
                    prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });
                    //放入到返回的集合中.    
                    oblist.Add(ob);
                }
                return oblist;
            }
    
            /// <summary>     
            /// 转化一个DataTable    
            /// </summary>      
            /// <typeparam name="T"></typeparam>    
            /// <param name="list"></param>    
            /// <returns></returns>    
            public static DataTable ToDataTable<T>(this IEnumerable<T> list)
            {
                //创建属性的集合    
                List<PropertyInfo> pList = new List<PropertyInfo>();
                //获得反射的入口    
                Type type = typeof(T);
                DataTable dt = new DataTable();
                //把所有的public属性加入到集合 并添加DataTable的列    
                Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); });
                foreach (var item in list)
                {
                    //创建一个DataRow实例    
                    DataRow row = dt.NewRow();
                    //给row 赋值    
                    pList.ForEach(p => row[p.Name] = p.GetValue(item, null));
                    //加入到DataTable    
                    dt.Rows.Add(row);
                }
                return dt;
            }
    
            /// <summary>    
            /// 将泛型集合类转换成DataTable    
    
            /// </summary>    
            /// <typeparam name="T">集合项类型</typeparam>    
    
            /// <param name="list">集合</param>    
            /// <returns>数据集(表)</returns>    
            public static DataTable ToDataTable<T>(IList<T> list)
            {
                return ToDataTable<T>(list, new Dictionary<string, string>(), null);
    
            }
    
            /**/
    
            /// <summary>    
            /// 将泛型集合类转换成DataTable    
            /// </summary>    
            /// <typeparam name="T">集合项类型</typeparam>    
            /// <param name="list">集合</param>    
            /// <param name="="propertyRenameDic">需要指定重命名的列集合</param>
            /// <param name="propertyName">需要返回的列的列名</param>    
            /// <returns>数据集(表)</returns>    
            public static DataTable ToDataTable<T>(IList<T> list, Dictionary<string, string> propertyRenameDic, params string[] propertyName)
            {
                List<string> propertyNameList = new List<string>();
                if (propertyName != null)
                {
                    propertyNameList.AddRange(propertyName);
                    if (propertyRenameDic.Count > 0)
                    {
                        foreach (var item in propertyRenameDic)
                        {
                            propertyNameList.Remove(item.Key);
                            propertyNameList.Add(item.Value);
                        }
                    }
                }
                DataTable result = new DataTable();
                if (list.Count > 0)
                {
                    PropertyInfo[] propertys = typeof(T).GetProperties();
                    foreach (PropertyInfo pi in propertys)
                    {
                        if (propertyNameList.Count == 0)
                        {
                            //处理遇到可空类型的情况.动态反射成目标类型
                            if (!pi.PropertyType.IsGenericType) result.Columns.Add(pi.Name, pi.PropertyType);
                            else
                            {
                                Type genericTypeDefinition = pi.PropertyType.GetGenericTypeDefinition();
                                if (genericTypeDefinition == typeof(Nullable<>))
                                    result.Columns.Add(pi.Name, Nullable.GetUnderlyingType(pi.PropertyType));
                            } 
                        }
                        else
                        {
                            if (propertyNameList.Contains(pi.Name))
                                result.Columns.Add(pi.Name, pi.PropertyType);
                            if (propertyRenameDic.Keys.Contains(pi.Name))
                            {
                                if (propertyNameList.Contains(propertyRenameDic[pi.Name]))
                                {
                                    if (!pi.PropertyType.IsGenericType) result.Columns.Add(propertyRenameDic[pi.Name], pi.PropertyType);
                                    else
                                    {
                                        Type genericTypeDefinition = pi.PropertyType.GetGenericTypeDefinition();
                                        if (genericTypeDefinition == typeof(Nullable<>))
                                            result.Columns.Add(propertyRenameDic[pi.Name], Nullable.GetUnderlyingType(pi.PropertyType));
                                    }
                                } 
                            }
    
                        }
                    }
    
                    for (int i = 0; i < list.Count; i++)
                    {
                        ArrayList tempList = new ArrayList();
                        foreach (PropertyInfo pi in propertys)
                        {
                            if (propertyNameList.Count == 0)
                            {
                                object obj = pi.GetValue(list[i], null);
                                tempList.Add(obj);
                            }
                            else
                            {
                                if (propertyRenameDic.Keys.Contains(pi.Name))
                                {
                                    if (propertyNameList.Contains(pi.Name) || propertyNameList.Contains(propertyRenameDic[pi.Name]))
                                    {
                                        object obj = pi.GetValue(list[i], null);
                                        tempList.Add(obj);
                                    }
                                }
                                else
                                {
                                    if (propertyNameList.Contains(pi.Name))
                                    {
                                        object obj = pi.GetValue(list[i], null);
                                        tempList.Add(obj);
                                    }
                                }
    
                            }
                        }
                        object[] array = tempList.ToArray();
                        result.LoadDataRow(array, true);
                    }
                }
                return result;
            }
    
            /// <summary>
            /// 将DataTable新增几列并指定默认值
            /// </summary>
            /// <param name="vTable">源表</param>
            /// <param name="list">增加的列集合</param>
            /// <returns></returns>
            public static DataTable AddColums(DataTable vTable, List<ListTranTableModel> list)
            {
                foreach (var item in list)
                {
                    //添加一新列,其值为默认值
                    DataColumn dc = new DataColumn(item.addColumName, item.tableCloumDInfo.dataType);
                    dc.DefaultValue = item.tableCloumDInfo.defaultValue;
                    dc.AllowDBNull = false;//这在创建表的时候,起作用,在为已有表新增列的时候,不起作用
                    vTable.Columns.Add(dc);
                }
                return vTable;
            }
        }
    
    
    
     

     调用举例  

     DataTable dt = ListTranDataTableHelper.ToDataTable(listv, DatableProperty.PropertyRenameDic);
  • 相关阅读:
    Java测试用例简介
    Hive使用入门
    Java中的GetOpt操作
    Tomcat的文件列表服务
    Hadoop MapReduce 初步学习总结
    hadoop集群调优-OS和文件系统部分
    02怎么学数据结构?
    01为什么学习数据结构?
    MySQL实战06の锁
    MySQL实战05の索引(下)
  • 原文地址:https://www.cnblogs.com/zzlblog/p/10013072.html
Copyright © 2020-2023  润新知