首页 > 代码库 > List<T>转换为DataTable

List<T>转换为DataTable

public static class DataTableExtensions

   {
       /// <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 转换为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) p.SetValue(ob, row[p.Name], null); });
               //放入到返回的集合中.
               oblist.Add(ob);
           }
           return oblist;
       }
 
 
       /// <summary>
       /// 将集合类转换成DataTable
       /// </summary>
       /// <param name="list">集合</param>
       /// <returns></returns>
       public 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);
               }
 
               for (int i = 0; i < list.Count; i++)
               {
                   ArrayList tempList = new ArrayList();
                   foreach (PropertyInfo pi in propertys)
                   {
                       object obj = pi.GetValue(list[i], null);
                       tempList.Add(obj);
                   }
                   object[] array = tempList.ToArray();
                   result.LoadDataRow(array, true);
               }
           }
           return result;
       }
 
       /**/
       /// <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, null);
       }
 
       /**/
       /// <summary>
       /// 将泛型集合类转换成DataTable
       /// </summary>
       /// <typeparam name="T">集合项类型</typeparam>
       /// <param name="list">集合</param>
       /// <param name="propertyName">需要返回的列的列名</param>
       /// <returns>数据集(表)</returns>
       public static DataTable ToDataTable<T>(IList<T> list, params string[] propertyName)
       {
           List<string> propertyNameList = new List<string>();
           if (propertyName != null)
               propertyNameList.AddRange(propertyName);
 
           DataTable result = new DataTable();
           if (list.Count > 0)
           {
               PropertyInfo[] propertys = list[0].GetType().GetProperties();
               foreach (PropertyInfo pi in propertys)
               {
                   if (propertyNameList.Count == 0)
                   {
                       result.Columns.Add(pi.Name, pi.PropertyType);
                   }
                   else
                   {
                       if (propertyNameList.Contains(pi.Name))
                           result.Columns.Add(pi.Name, 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 (propertyNameList.Contains(pi.Name))
                           {
                               object obj = pi.GetValue(list[i], null);
                               tempList.Add(obj);
                           }
                       }
                   }
                   object[] array = tempList.ToArray();
                   result.LoadDataRow(array, true);
               }
           }
           return result;
       }
   }