zoukankan      html  css  js  c++  java
  • [工具类]DataTable与泛型集合List互转

    写在前面

    工作中经常遇到datatable与list,对于datatable而言操作起来不太方便。所以有的时候还是非常希望通过泛型集合来进行操作的。所以这里就封装了一个扩展类。也方便使用。

    方法中主要使用了反射的方式动态的为属性赋值以及取值。

       public static class Extension
        {
            /// <summary>
            /// 将datatable转换为泛型集合
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="inputDataTable"></param>
            /// <returns></returns>
            public static List<TEntity> ToList<TEntity>(this DataTable inputDataTable) where TEntity : class,new()
            {
                if (inputDataTable == null)
                {
                    throw new ArgumentNullException("input datatable is null");
                }
                Type type = typeof(TEntity);
                PropertyInfo[] propertyInfos = type.GetProperties();
                List<TEntity> lstEntitys = new List<TEntity>();
                foreach (DataRow row in inputDataTable.Rows)
                {
                    object obj = Activator.CreateInstance(type);
                    foreach (PropertyInfo pro in propertyInfos)
                    {
                        foreach (DataColumn col in inputDataTable.Columns)
                        {
                            //如果直接查询的数据库,数据库是不区别大小写的,所以转换为小写忽略大小写的问题
                            if (col.ColumnName.ToLower().Equals(pro.Name.ToLower()))
                            {
                                //属性是否是可写的,如果是只读的属性跳过。
                                if (pro.CanWrite)
                                {
                                    //判断类型,基本类型,如果是其他的类属性
                                    if (pro.PropertyType == typeof(System.Int32))
                                    {
                                        pro.SetValue(obj, Convert.ToInt32(row[pro.Name.ToLower()]));
                                    }
                                    else if (pro.PropertyType == typeof(System.String))
                                    {
                                        pro.SetValue(obj, row[pro.Name.ToLower()].ToString());
                                    }
                                    else if (pro.PropertyType == typeof(System.Boolean))
                                    {
                                        pro.SetValue(obj, Convert.ToBoolean(row[pro.Name.ToLower()]));
                                    }
                                    else if (pro.PropertyType == typeof(System.DateTime))
                                    {
                                        pro.SetValue(obj, Convert.ToDateTime(row[pro.Name.ToLower()]));
                                    }
                                    else if (pro.PropertyType == typeof(System.Int64))
                                    {
                                        pro.SetValue(obj, Convert.ToInt64(row[pro.Name.ToLower()]));
                                    }
                                    else
                                    {
                                        pro.SetValue(obj, row[pro.Name.ToLower()]);
                                    }
    
                                }
                            }
                        }
                    }
                    TEntity tEntity = obj as TEntity;
                    lstEntitys.Add(tEntity);
                }
                return lstEntitys;
            }
            /// <summary>
            /// 将list转换为datatable
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="inputList"></param>
            /// <returns></returns>
            public static DataTable ToDataTable<TEntity>(this List<TEntity> inputList) where TEntity : class,new()
            {
                if (inputList == null)
                {
                    throw new ArgumentNullException("inputList");
                }
                DataTable dt = null;
                Type type = typeof(TEntity);
                if (inputList.Count == 0)
                {
                    dt = new DataTable(type.Name);
                    return dt;
                }else{dt=new DataTable();}
                PropertyInfo[] propertyInfos = type.GetProperties();
                foreach (var item in propertyInfos)
                {
                    dt.Columns.Add(new DataColumn() { ColumnName = item.Name, DataType = item.PropertyType });
                }
                foreach (var item in inputList)
                {
                    DataRow row = dt.NewRow();
                    foreach (var pro in propertyInfos)
                    {
                        row[pro.Name] = pro.GetValue(item);
                    }
                    dt.Rows.Add(row);
                }
                return dt;
            }

     总结

    有些时候能偷懒就偷懒了,把常用的工具类自己封装下,下次使用的时候拿来用就可以了。

  • 相关阅读:
    C++后台开发校招面试常见问题
    算术表达式的前缀,中缀,后缀相互转换
    Redis键值对数据库的设计与实现
    C++经典面试题(最全,面中率最高)
    C++开发工程师面试题大合集
    C++中常用的设计模式
    C++中const修饰函数,函数参数,函数返回值的作用
    C++main函数的参数介绍以及如何在main函数前执行一段代码
    Windows系统下安装tensorflow+keras深度学习环境
    第十三周学习总结
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/5018901.html
Copyright © 2011-2022 走看看