封装一个List集合和datatable相互转换的工具类
Posted zzlblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封装一个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) 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 = 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); if (propertyRenameDic.Keys.Contains(pi.Name)) { if (propertyNameList.Contains(propertyRenameDic[pi.Name])) result.Columns.Add(propertyRenameDic[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 (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);