集合转换类,主要是将list转换为table,将table转换为list等等
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; namespace SEAEYE.WEB2._0.component { /// <summary> /// 集合转换类 /// </summary> public class CollectionConversion { public static class Convert<T> where T : new() { /// <summary> /// DataTable 2 list /// </summary> /// <param name="dt"></param> /// <returns></returns> public static List<T> ToList(DataTable dt) { // 定义集合 List<T> ts = new List<T>(); // 获得此模型的类型 Type type = typeof(T); //定义一个临时变量 //遍历DataTable中所有的数据行 foreach (DataRow dr in dt.Rows) { T t = new T(); // 获得此模型的公共属性 PropertyInfo[] propertys = t.GetType().GetProperties(); //遍历该对象的所有属性 foreach (PropertyInfo pi in propertys) { string tempName = pi.Name; //检查DataTable是否包含此列(列名==对象的属性名) if (dt.Columns.Contains(tempName)) { // 判断此属性是否有Setter if (!pi.CanWrite) continue;//该属性不可写,直接跳出 //取值 object value = dr[tempName]; //如果非空,则赋给对象的属性 if (value != DBNull.Value) pi.SetValue(t, value, null); } } //对象添加到泛型集合中 ts.Add(t); } return ts; } /// <summary> /// List 2 DataTable /// </summary> /// <typeparam name="T"></typeparam> /// <param name="list"></param> /// <returns></returns> public static DataTable ToDataTable(IEnumerable<T> list) { List<PropertyInfo> pList = new List<PropertyInfo>(); // 创建属性的集合 Type type = typeof(T); // 获得反射的入口 DataTable dt = new DataTable(); // 把所有的public属性加入到集合 并添加DataTable的列 Array.ForEach(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); }); foreach (var item in list) { DataRow row = dt.NewRow();// 创建一个DataRow实例 pList.ForEach(p => row[p.Name] = p.GetValue(item, null)); // 给row 赋值 dt.Rows.Add(row); // 加入到DataTable } return dt; } } /// <summary> /// 自动进行列数值统计 /// </summary> /// <param name="dt">要统计的 DataTable </param> /// <param name="columnNames">name1,name2,name3</param> /// <returns></returns> public static DataTable StatisticsDt(DataTable dt, string columnNames) { if (columnNames == "") return dt; // 如果为空,则返回原始数据源 dt = SetDataTableColumnTypeToString(dt); try { DataRow dr = dt.NewRow(); decimal num; dr[0] = Style("合计"); if (columnNames.Contains(",")) // 多个列名使用逗号分隔 { IList<string> names = columnNames.Split(','); foreach (string s in names.Where(it => it != "")) { num = dt.AsEnumerable().Sum(x => Convert.ToDecimal(x[s])); // 不使用 Compute 计算,保证类型正确 dr[dt.Columns.IndexOf(s)] = Style(num.ToString("N")); // 获取列对应的索引位置,保证合计值存放到对应的列底部 } } else // 同上 { num = dt.AsEnumerable().Sum(x => Convert.ToDecimal(x[columnNames])); dr[dt.Columns.IndexOf(columnNames)] = Style(num.ToString("N")); } dt.Rows.Add(dr); } catch (Exception) { return dt; } return dt; } /// <summary> /// 样式格式化 /// </summary> /// <param name="font"></param> /// <returns></returns> private static string Style(string font) { return string.Format("<span style='color:red;'>{0}</span>", font); } /// <summary> /// 设置 DataTable 列类型为 String /// </summary> /// <param name="dt"></param> /// <returns></returns> public static DataTable SetDataTableColumnTypeToString(DataTable dt) { if (dt.Rows.Count == 0) return dt; try { DataTable newDt = dt.Clone(); // 复制表结构 foreach (DataColumn col in newDt.Columns) // 重置类型为 String { col.DataType = Type.GetType("System.String"); } foreach (DataRow dr in dt.Rows) { DataRow newRow = newDt.NewRow(); foreach (DataColumn col in dt.Columns) { newRow[col.ColumnName] = dr[col.ColumnName]; } newDt.Rows.Add(newRow); } return newDt; } catch (Exception) { return dt; } } /// <summary> /// 快速统计 List /// </summary> /// <remarks>不可自定义数据类型</remarks> /// <param name="list"></param> /// <param name="columnNames"></param> /// <returns></returns> public static List<T> QuickStatisticsForList<T>(IEnumerable<T> list, string columnNames) where T : new() { return Convert<T>.ToList(StatisticsDt(Convert<T>.ToDataTable(list), columnNames)); } /// <summary> /// 快速统计 DataTable /// </summary> /// <remarks>支持单元格各种格式修改</remarks> /// <param name="list"></param> /// <param name="columnNames"></param> /// <returns></returns> public static DataTable QuickStatisticsForDataTable<T>(IEnumerable<T> list, string columnNames) where T : new() { return StatisticsDt(Convert<T>.ToDataTable(list), columnNames); } } }