| using System; | 
| using System.Collections; | 
| using System.Collections.Generic; | 
| using System.ComponentModel; | 
| using System.Data; | 
| using System.Linq; | 
| using System.Reflection; | 
| using System.Text; | 
| using System.Threading.Tasks; | 
| using System.Windows.Forms; | 
| using WZ.Useful.Commons; | 
|   | 
|   | 
| namespace iWareCommon.Utils | 
| { | 
|     public static class DataTableHelper | 
|     { | 
|         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) | 
|                 { | 
|                     try | 
|                     { | 
|                         Type nullInt32 = typeof(Int32?); | 
|                         Type classicInt32 = typeof(Int32); | 
|                         if (propertyNameList.Count == 0) | 
|                         { | 
|                             //result.Columns.Add(pi.Name, pi.PropertyType); | 
|                             var tmp = pi.PropertyType.UnderlyingSystemType.ToString(); | 
|                             result.Columns.Add(pi.Name, tmp.Contains("System.Nullable") ? classicInt32 : pi.PropertyType); | 
|                         } | 
|                         else | 
|                         { | 
|   | 
|                             if (propertyNameList.Contains(pi.Name)) | 
|                             { | 
|                                 var tmp = pi.PropertyType.UnderlyingSystemType.ToString(); | 
|                                 result.Columns.Add(pi.Name, tmp.Contains("System.Nullable") ? classicInt32 : pi.PropertyType); | 
|                             } | 
|                         } | 
|                     } | 
|                     catch (Exception ex) | 
|                     { | 
|                         MessageBox.Show(ex.ToString()); | 
|                     } | 
|                 } | 
|   | 
|                 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; | 
|         } | 
|         public static void DataSetToExcel(DataTable ds) | 
|         { | 
|             string filePath = FileDialogHelper.SaveExcel(); | 
|             WZ.Useful.Commons.ExcelHelper.DataSetToExcel(ds, filePath); | 
|   | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 将linq查询转换为datatable | 
|         /// </summary> | 
|         /// <typeparam name="T"></typeparam> | 
|         /// <param name="array"></param> | 
|         /// <returns></returns> | 
|         public static DataTable CopyToDataTable<T>(IEnumerable<T> array) | 
|         { | 
|             if (array == null) | 
|             { | 
|                 return null; | 
|             } | 
|             var ret = new DataTable(); | 
|             foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T))) | 
|                 ret.Columns.Add(dp.Name); | 
|   | 
|             foreach (T item in array) | 
|             { | 
|                 var Row = ret.NewRow(); | 
|                 foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T))) | 
|                     Row[dp.Name] = dp.GetValue(item); | 
|                 ret.Rows.Add(Row); | 
|             } | 
|             return ret; | 
|         } | 
|   | 
|   | 
|         /// <summary> | 
|         /// 根据列名,将linq查询转换为datatable | 
|         /// </summary> | 
|         /// <typeparam name="T"></typeparam> | 
|         /// <param name="array"></param> | 
|         /// <returns></returns> | 
|         public static DataTable CopyToDataTable<T>(IEnumerable<T> array, string[] columns, string[] columnNames) | 
|         { | 
|             if (array == null) | 
|             { | 
|                 return null; | 
|             } | 
|             var ret = new DataTable(); | 
|             foreach (var item in columnNames) | 
|             { | 
|                 ret.Columns.Add(item); | 
|             } | 
|   | 
|             foreach (T item in array) | 
|             {//遍历实体类中的每一个实体 | 
|                 var Row = ret.NewRow(); | 
|                 for (int i = 0; i < columns.Length; i++) | 
|                 { | 
|                     foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T))) | 
|                     {//遍历一个实体类的所有属性  | 
|                         if (dp.Name == columns[i]) | 
|                         { | 
|                             Row[columnNames[i]] = dp.GetValue(item); | 
|                             break; | 
|                         } | 
|                     } | 
|                 } | 
|                 ret.Rows.Add(Row); | 
|             } | 
|             return ret; | 
|         } | 
|   | 
|     } | 
| } |