List泛型与DataTable相互转换
public static class ExtensionMethods
{
/// <summary>
/// 将List转换成DataTable
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data"></param>
/// <returns></returns>
public static DataTable ToDataTable<T>(this IList<T> data)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
DataTable dt = new DataTable();
for (int i = 0; i < properties.Count; i++)
{
PropertyDescriptor property = properties[i];
dt.Columns.Add(property.Name, property.PropertyType);
}
object[] values = new object[properties.Count];
foreach (T item in data)
{
for (int i = 0; i < values.Length; i++)
{
values[i] = properties[i].GetValue(item);
}
dt.Rows.Add(values);
}
return dt;
}
/// <summary>
/// DataTable转泛型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt">DataTable</param>
/// <returns></returns>
public static List<T> ToList<T>(this DataTable dt) where T : class, new()
{
//获取类
Type t = typeof(T);
//反射 using System.Reflection;
//获取当前Type的公共属性
PropertyInfo[] propertys = t.GetProperties();
List<T> list = new List<T>();
//字段名称
string typeName = string.Empty;
//遍历DataTable每行
foreach (DataRow dr in dt.Rows)
{
//创建实体
T entity = new T();
//遍历实体的公共属性
foreach (PropertyInfo pi in propertys)
{
//将字段名称赋值
typeName = pi.Name;
if (dt.Columns.Contains(typeName))
{
//获取一个值,该值指定此属性是否可写 set
if (!pi.CanWrite) continue;
//根据字段名称获取对应值
object value = dr[typeName];
//若不存在 则跳出
if (value == DBNull.Value) continue;
//获取此属性的类型是否是string类型
if (pi.PropertyType == typeof(string))
{
//PropertyInfo.SetValue()三个参数
//第一个 将设置其属性值的对象。
//第二个 新的属性值。
//第三个 索引化属性的可选索引值。 对于非索引化属性,该值应为 null。
pi.SetValue(entity, value.ToString(), null);
}
else if (pi.PropertyType == typeof(int))
{
//写入
pi.SetValue(entity, int.Parse(value.ToString()), null);
}
else if (pi.PropertyType == typeof(DateTime))
{
//写入
pi.SetValue(entity, DateTime.Parse(value.ToString()), null);
}
else
{
pi.SetValue(entity, value, null);
}
}
}
//加入泛型末尾
list.Add(entity);
}
return list;
}
}
List泛型与DataTable相互转换的更多相关文章
- 泛型转Datatable
//自定义扩展方法 public static class ExtMethod { //泛型转为DataTable public static DataTable AsDataTable<T&g ...
- 封装一个List集合和datatable相互转换的工具类(可对指定列进行重命名并且指定输出列)
/// <summary> /// List转换为DataTable对象 /// </summary> public class ListTranTableModel { // ...
- XML IList<T> TO DataSet TO DataTable 相互转换
//遍历XML 获得 DataSet //XmlTextReader static void Main(string[] args) { string xmlData = @"D:\stud ...
- 【转载】ArcEngine ITable 与System.DataTable相互转换
/// <summary> /// 打开dbf表 /// </summary> /// <param name="pathName"></ ...
- C#.net开发 List与DataTable相互转换 【转】
http://blog.csdn.net/shuizhaoshui/article/details/51425527 在.NET开发中,操作关系型数据库提取数据经常用到DataTable.ASP.NE ...
- 实体对象,List泛型 转换为DataTable
/// <summary> /// 实体对象转换DataTable /// </summary> /// <param name ...
- json与DataTable相互转换
首先我们看看 Newtonsoft.Json.JsonConvert 是怎么完成的: DataTable table = new DataTable(); table.Columns.Add(&quo ...
- XML与DataTable相互转换
1.DataTable转XML #region DataTableToXml /// <summary> /// 将DataTable对象转换成XML字符串 /// </summar ...
- C#.net开发 List与DataTable相互转换
1.DataTable转List集合 /// <summary> /// DataTable转化为List集合 /// </summary> /// <typeparam ...
随机推荐
- mysql中外键的特点
mysql中外键的特点简单描述: 1.要求在从表中设置外键关系: 2.从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求: 3.主表的关联列必须是一个key(一般是主键或唯一键): 4. ...
- tcp关闭状态详解
tcp关闭连接不区分客户端和服务端,哪一端口可以主动发起关闭连接请求.所以为了描述方便,描述中的“主动方”表示主动发起关闭连接一方,“被动方”表示被动关闭连接一方. 1. tcp关闭连接状态转换 上图 ...
- session 控制单点登录
在我登录成功之后,我会 session.setAttribute("user", userMap);//设置session 所以就写了一个监听器来控制登录的. package or ...
- Jenkins持续集成介绍及插件安装版本更新演示(一)--技术流ken
Jenkins介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. Jenkins功能包括: ...
- 跨域学习笔记1--跨域调用webapi
在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webapi的程序,如下图所示: 由于微软已 ...
- mysql循环插入数据、生成随机数及CONCAT函数
实现目标:一年12个月,每个月插入一条数据,score为1-5的随机数 循环语句: WHILE -- DO -- END WHILE DELIMITER ; CREATE PROCEDURE test ...
- C#基础知识总结(四)
摘要 循环结构的总结.跳转语句(break.continue).调试程序 一.循环结构的总结 1.while循环 ; ) { Console.WriteLine(i); i++; } 2.do-whi ...
- [linux] tcpdump抓包案例
1.常见参数 tcpdump -i eth0 -nn -s0 -v port 80 -i 选择监控的网卡 -nn 不解析主机名和端口号,捕获大量数据,名称解析会降低解析速度 -s0 捕获长度无限制 - ...
- Tomcat服务器为java项目配置顶级域名
修改端口, Tomcat服务器下conf/server.xml文件 把端口号更改为80 解释:输入域名时默认进入80端口,如果没修改则需要输入端口号才能进入. Eg:www.xxx.com: ...
- 黑客常用 Linux 入侵常用命令
大学曾误入歧途算是一个脚本小子.... 系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cp ...