应用场景

实际开发场景下会经常出现DataTable和List对象需要相互转换的时候,通过方法提取避免重复造轮子

List转换成DataTable

基本思路:

向DataTable里面添加新的数据内容的话要确定两个部分,一是列名,而是当前列对应的值。通过获取传入对象的类型获取到当前对象的公共属性就可以得到列名,再对当前对象进行循环,就可以得到当前对象的该属性对应的值。

public static class DataTableHelper
{
public static DataTable ListToDataTable<TEntity>(List<TEntity> entities) where TEntity : class, new()
{
if (entities == null)
{
return null;
}
//获取模型类型
Type type = typeof(TEntity);
//获取该类型的公共属性
PropertyInfo[] properties = type.GetProperties();
DataTable dt = new DataTable(type.Name);
//根据属性名和属性类型向DataTable里面添加字段、字段类型
foreach (var item in properties)
{
dt.Columns.Add(new DataColumn(item.Name) { DataType = item.PropertyType });
} foreach (var item in entities)
{
DataRow row = dt.NewRow();
foreach (var property in properties)
{
row[property.Name] = property.GetValue(item);
}
dt.Rows.Add(row);
} return dt;
}
}

DataTable转List

基本思路

基本思路和上面的方法类似,获取当前准备转换对象的属性,然后循环DataTable对比是否存在当前属性名的列,存在则获取当前值。

public static IList<T> DataTableToList<T>(DataTable dt) where T : class, new()
{
if (dt.Rows.Count == 0)
{
return new List<T>();
}
IList<T> list = new List<T>();
Type type = typeof(T);
//获取当前类型公共属性
PropertyInfo[] properties = type.GetProperties(); foreach (DataRow dr in dt.Rows)
{
T t = new T();
foreach (var property in properties)
{
//对比列名确认数据是否存在
if (dt.Columns.Contains(property.Name))
{
//检查是否能写入
if (!property.CanWrite) continue; var value = dr[property.Name];
if (value != null) { property.SetValue(t, value); }
}
}
}
return list;
}

DataTable转List

    public static List<Dictionary<string,object>> DataToList(DataTable dt)
{
List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
foreach (DataRow dr in dt.Rows)
{
Dictionary<string, object> res = new Dictionary<string, object>();
foreach (DataColumn dc in dt.Columns)
{
res.Add(dc.ColumnName, dr[dc].ToString());
}
list.Add(res);
}
return list;
}

C# 泛型对象和DataTable之间的相互转换的更多相关文章

  1. JSON对象与字符串之间的相互转换

    <html> <head> <meta name="viewport" content="width=device-width" ...

  2. Json数组操作小记 及 JSON对象和字符串之间的相互转换

    [{"productid":"1","sortindex":"2"},{"productid":&q ...

  3. JSON对象与字符串之间的相互转换 - CSDN博客

    原文:JSON对象与字符串之间的相互转换 - CSDN博客 <html> <head> <meta name="viewport" content=& ...

  4. FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换

    fastJson对于json格式字符串的解析主要用到了一下三个类: JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换. JSONObject:fas ...

  5. FastJson学习:JSON格式字符串、JSON对象及JavaBean之间的相互转换

    当前台需要传送一系列相似数据到后端时,可以考虑将其组装成json数组对象,然后转化为json形式的字符串传输到后台 例如: nodes = $('#PmPbsSelect_tree').tree('g ...

  6. JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)

    在Firefox,chrome,opera,safari,ie9,ie8等高级浏览器直接可以用JSON对象的stringify()和parse()方法. JSON.stringify(obj)将JSO ...

  7. JSON对象和字符串之间的相互转换

    比如我有两个变量,我要将a转换成字符串,将b转换成JSON对象: var a={"name":"tom","sex":"男&quo ...

  8. 解析JSON对象与字符串之间的相互转换

    在开发的过程中,如果对于少量参数的前后台传递,可以直接采用ajax的data函数,按json格式传递,后台Request即可,但有的时候,需要传递多个参数,这样后台 接受的时候Request多个很麻烦 ...

  9. Android中Bitmap对象和字节流之间的相互转换

    android 将图片内容解析成字节数组,将字节数组转换为ImageView可调用的Bitmap对象,图片缩放,把字节数组保存为一个文件,把Bitmap转Byte   import java.io.B ...

  10. 小tips:JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)

    在Firefox,chrome,opera,safari,ie9,ie8等高级浏览器直接可以用JSON对象的stringify()和parse()方法. JSON.stringify(obj)将JSO ...

随机推荐

  1. 详解Web应用安全系列(10)文件上传漏洞

    文件上传漏洞(File Upload Vulnerabilities)是Web攻击中常见的一种安全漏洞,它允许攻击者上传并执行恶意文件,从而可能对Web服务器造成严重的安全威胁. 一.定义与原理 文件 ...

  2. 洛谷P1003

    洛谷P1003 题目大意 简而言之就是在坐标轴上铺地毯,根据输入的坐标将地毯放在坐标轴上,然后最后给出一个坐标,找到铺在这个坐标上最上面的地毯编号 Train of thought 首先我们应该找到每 ...

  3. Unity无法安装Entities 1.2.0 Package的解决方法

    会出现如下的错误提示: 本质原因是国内版的Unity使用了自己的Package加速CDN:packages.unity.cn,而不是官方的packages.unity.com.而这个CDN更新了Ent ...

  4. PHP函数http_build_query使用详解

    什么是http_build_query? 使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串.参数 formdata 可以是数组或包含属性的对象.一个 formdata 数组 ...

  5. CF1363A 题解

    洛谷链接&CF 链接 题目简述 共有 \(T\) 组数据. 对于每组数据,给定 \(n,x\) 和 \(n\) 个数,问是否可以从 \(n\) 个数中选 \(x\) 个使其和为奇数,可以输出 ...

  6. Nginx 工作原理简介

    在了解Nginx工作原理之前,我们先来了解下几个基本的概念 以及常见的I/O模型. 基本概念 同步:就是指调用方发起一个调用,在没有得到调用结果之前,该调用不返回.换句话说,也就是调用方发起一个调用后 ...

  7. bloom效果

    搜索 复制

  8. STM32F103 SPI详解及示例代码

    1 SPI协议详解 SPI是串行外设接口(Serial Peripheral Interface)的缩写,是美国摩托罗拉公司(Motorola)最先推出的一种同步串行传输规范,也是一种单片机外设芯片串 ...

  9. SSL/TLS 深入浅出

    SSL,https(HTTP over SSL), X.509, SSL 证书 ,证书申请 /导入/签发, 等名词,想必有一定工作经验的小伙伴,一定都会略有耳闻,或者至少也听神边大神念叨过.虽然司空见 ...

  10. 1、Springboot2简介

    在学习 SpringBoot 之前,建议先具备 SpringMVC(控制层).Spring(业务层)和 Mybatis(持久层)的相关知识 1.1.概述 1.1.1.Spring的缺点 Spring ...