封装一个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 > )
{
PropertyInfo[] propertys = list[].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) != -) 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>)
{
foreach (var item in propertyRenameDic)
{
propertyNameList.Remove(item.Key);
propertyNameList.Add(item.Value);
}
}
}
DataTable result = new DataTable();
if (list.Count > )
{
PropertyInfo[] propertys = list[].GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
if (propertyNameList.Count == )
{
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 = ; i < list.Count; i++)
{
ArrayList tempList = new ArrayList();
foreach (PropertyInfo pi in propertys)
{
if (propertyNameList.Count == )
{
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);
封装一个List集合和datatable相互转换的工具类(可对指定列进行重命名并且指定输出列)的更多相关文章
- List集合和JSON互转工具类
public class JsonListUtil { /** * List<T> 转 json 保存到数据库 */ public static <T> String list ...
- 浅析Android Camera开发中的三个尺寸和三种变形 (贡献一个自适配Picturesize和Previewsize的工具类)
转至 (http://blog.csdn.net/yanzi1225627/article/details/17652643) 经常听人问Camera开发中,各种变形问题,今天有空就在此梳理总结下. ...
- DataSet转换为泛型集合和DataRow 转成 模型类
public static class TransformToList { /// <summary> /// DataSet转换为泛型集合 /// </summary> // ...
- 一个具有缓存数据功能的HttpWebRequest工具类
背景:一个公共站点中的数据,供其它子站点共享,为了提高性能,简单实现了Http 1.1的缓存功能 特点:可以缓存Html数据到内存中;缓存具有过期时间;缓存过期后,通过再确认的方式来决定是否更新缓存; ...
- 方法:一个简单的读取配置文件.properties的工具类 JAVA
import java.util.ResourceBundle; public class ConfigHelper { private static ConfigHelper instance; p ...
- 一个很好的通用 excel 导出工具类
此类用主要 jxl +注解+流 实现扩展性很强,jxl性能会比poi好一点,值得我们学习. package oa.common.utils; import java.io.OutputStream; ...
- [Unity]C#中 将XML和实体类之间进行相互转换的工具类
using System; using System.Xml; using System.Xml.Serialization; using System.IO; namespace LOTool { ...
- Android 开发 记录一个DP、PX、SP转换工具类
public class UnitConversionUtil { /** * 根据手机分辨率从DP转成PX * @param context * @param dpValue * @return * ...
- spring 中 PO与DTO相互转换的工具类
public class BeanMapper { /** * 持有Dozer单例, 避免重复创建DozerMapper消耗资源. */ private static DozerBeanMapper ...
随机推荐
- { ($0, Resolver($0.box)) }(Promise<T>(.pending)):闭包的定义与执行合一
public class func pending() -> (promise: Promise<T>, resolver: Resolver<T>) { return ...
- Python:IPC-Pipe与IPC-Manger
1,IPC-PIPE: 管道 pipe from multiprocessing import Process from multiprocessing import Pipe p1,p2 = Pip ...
- 问题 A: B 继承 圆到圆柱体
题目描述 定义了Circle圆形类,在此基础上派生出Cylinder圆柱体类. Circle圆形类定义如下: class Circle { public: Circle(double r):radiu ...
- P2341 [HAOI2006]受欢迎的牛 强连通
题目背景 本题测试数据已修复. 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的——如果A喜 ...
- SpringMVC学习记录五——功能开发及参数处理
15 包装类型pojo参数绑定 15.1 需求 商品查询controller方法中实现商品查询条件传入. 15.2 实现方法 第一种方法:在形参中 添加HttpServ ...
- SpringBoot非官方教程 | 第十五篇:Springboot整合RabbitMQ
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot15-rabbitmq/ 本文出自方志朋的博客 这 ...
- Flask—01-轻松入门Flask
Flask入门 WEB工作原理 C/S与B/S架构:客户端-服务器,浏览器-服务器 B/S架构工作原理 客户端(浏览器) <=> WEB服务器(nginx) <=> WSGI( ...
- TCP协议与UDP协议
网络通信协议规定了网络通信时,数据必须采用的格式.常见的协议有TCP协议,UDP协议. TCP协议 :(Transmission Control Protocol)传输控制协议. TCP是一种面向连接 ...
- 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士
基环外向树dp竟然如此简单…… Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发 ...
- baidu 地图 鼠标移上显示标签 鼠标离开隐藏标签
为了解决 label太多,文字会重叠看不清 所以提出这种办法 核心代码 1,创建的时候 将label设置为隐藏 2,通过百度地图监听事件 , mouseover或onmouseover 触发显示 3 ...