C#之DataTable转List与List转Datatable
闲来无事,只有写代码啦,以下为DataTable转List与List转DataTable的两个方法,主要技术点用到了反射原理:
/// <summary>
/// 模型转换类
/// </summary>
public class ConvertModel
{
/// <summary>
/// DataTable转List
/// </summary>
/// <typeparam name="T">list中的类型</typeparam>
/// <param name="dt">要转换的DataTable</param>
/// <returns></returns>
public static List<T> DatatTableToList<T>(DataTable dt) where T : class, new()
{
List<T> list = new List<T>();
T t = new T();
PropertyInfo[] prop = t.GetType().GetProperties();
//遍历所有DataTable的行
foreach (DataRow dr in dt.Rows)
{
t = new T();
//通过反射获取T类型的所有成员
foreach (PropertyInfo pi in prop)
{
//DataTable列名=属性名
if (dt.Columns.Contains(pi.Name))
{
//属性值不为空
if (dr[pi.Name] != DBNull.Value)
{
object value = Convert.ChangeType(dr[pi.Name], pi.PropertyType);
//给T类型字段赋值
pi.SetValue(t, value, null);
}
}
}
//将T类型添加到集合list
list.Add(t);
}
return list; } /// <summary>
/// List转换为DataTable
/// </summary>
/// <typeparam name="T">List中的类型</typeparam>
/// <param name="list">要转换的list</param>
/// <returns></returns>
public static DataTable ListToDataTable<T>(List<T> list) where T : class
{
DataTable dt = new DataTable();
PropertyInfo[] prop = typeof(T).GetProperties();
DataColumn[] ColumnArr = prop.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray();
dt.Columns.AddRange(ColumnArr);
foreach (T t in list)
{
DataRow dr = dt.NewRow();
foreach (PropertyInfo pi in prop)
{
if (dt.Columns.Contains(pi.Name))
{
if (pi.GetValue(t) != null)
{
dr[pi.Name] = pi.GetValue(t);
}
}
}
dt.Rows.Add(dr);
} return dt;
}
}
调用:
DataTable dt = new DataTable();
dt.Columns.Add("Id");
dt.Columns.Add("Sex");
dt.Columns.Add("Age");
dt.Columns.Add("Height");
DataRow dr = dt.NewRow();
dr["Id"] = ;
dr["Sex"] = ;
dr["Age"] = ;
dr["Height"] = ;
dt.Rows.Add(dr);
//将DataTable转换为List<Persion>
List<Persion> list1 = ConvertModel.DatatTableToList<Persion>(dt); List<Persion> list = new List<Persion>()
{
new Persion(){Id=,Sex=,Age=,Height=},
new Persion(){Id=,Sex=,Age=,Height=},
};
//将List<Persion>转换为DataTable
DataTable dt1 = ConvertModel.ListToDataTable<Persion>(list);
C#之DataTable转List与List转Datatable的更多相关文章
- C# DataTable转List And List转DataTable
// DataTable转List: IList<HousesEntity> Ilist = TableAndList.ConvertTo<HousesEntity>(dt); ...
- “DataTable”是“System.Data.DataTable”和“Microsoft.Office.Interop.Excel.DataTable”之间的不明确的引用
“DataTable”是“System.Data.DataTable”和“Microsoft.Office.Interop.Excel.DataTable”之间的不明确的引用 造成这个错误的原因是,在 ...
- 多个不同的表合并到一个datatable中,repeater在绑定datatable
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...
- 将两个列不同的DataTable合并成一个新的DataTable
/// <summary> /// 将两个列不同(结构不同)的DataTable合并成一个新的DataTable /// </summary> ...
- C#给DataTable添加序号、C#给DataTable添加合计、小计
/// <summary> /// 给DataTable添加序号 /// </summary> /// <param name= ...
- Datatable的查找和排序(Datatable.Select)
Datatable 是一种常用的数据结构.数据类型有点类似于数据库中的表结构.在没有使用优秀的orm框架前,大部分的数据库的数据都是先变为Datatable 然后再通过代码转换变成 object. ...
- EasyUI - Datatable转Json and Json转Datatable
using System; using System.Data; using System.Linq; using System.Collections; using System.Collectio ...
- C# 将DataTable一行放入另一个DataTable中
http://blog.csdn.net/huyu107/article/details/53509171 概述 从一个DataTable中取一行放到另一个DataTable里报错: 该行已经属于另一 ...
- NPOI json转Excel DataTable转Excel ,Excel转DataTable
JsonToExcel: public static void JsonToExcel(List<Dictionary<string, object>> json, strin ...
随机推荐
- [Link-Cut-Tree]【学习笔记】
可以按照<Utopiosphere>的调唱出来 “Link-Cut ,Time doesn’t stop .Prepare your doubts ,Eat them up” 参考资料: ...
- Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)(A.思维题,B.思维题)
A. Vicious Keyboard time limit per test:2 seconds memory limit per test:256 megabytes input:standard ...
- [bzoj1594] [Usaco2008 Jan]猜数游戏
二分答案(二分没冲突的前Q-1个问题),用并查集判定(用法同bzoj 1576) 假设一个询问区间[l,r],最小干草堆数目是A,我们可以得出[l,r]上的干草堆数目都>=A. 二分出mid后, ...
- POJ_2769同余问题
Reduced ID Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9310 Accepted: 374 ...
- Spider_Man_2 の requests模块
一:自我介绍
- 如何开发由Create-React-App 引导的应用(一)
此文章是翻译How to develop apps bootstrapped with Create React App 官方文档 系列文章 如何开发由Create-React-App 引导的应用 如 ...
- UVA 673 Parentheses Balance (栈)
题意描述: 给出一段只包含()和[]的字符串,判断是否合法,合法输出YES,不合法输出NO 规则: 1.该串为空,则合法 2.若A合法,B合法,则AB合法 3.若A合法,则(A)和[A]均合法 解题思 ...
- TPshop学习(8)微信支付
http://blog.csdn.net/phper8/article/details/76383415 学习内容: https://www.kancloud.cn/tpshop/thinkphp5/ ...
- 如何制作gif图片
制作Gif图片的方法很多,大多数情况下都会选择利用PS中的ImageReady插件来制作.其实还有其它更好的选择来制作Gift图片,其中一款软件就是利用Flash来实现.下面小编就给大家展示一下如何利 ...
- vue.js打包后,接口安全问题
后面有一位朋友回答后台origin判断,但另一个朋友说可以通过代理请求就绕过跨域. 想想也对,代理的话origin就无效了,页面还是可以跑起来. 不知道有没有人想过这个问题,还是我想的方向有误,请各位 ...