本案例提供了:把DataRow转换为单个实体、dataTable转换为List泛型支持时间格式转换。
下文的方法都是扩展方法。扩展方法要求写在静态类中,方法也要静态。
- 它必须在一个非嵌套、非泛型的静态类中
- 它至少要有一个参数
- 第一个参数必须加上this关键字作为前缀(第一个参数类型也称为扩展类型,即指方法对这个类型进行扩展)
- 第一个参数不能用其他任何修饰符(如不能使用ref out等修饰符)
- 第一个参数的类型不能是指针类型
1.将DataRow转换为实体
/// <summary> /// DataRow扩展方法:将DataRow类型转化为指定类型的实体 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <returns></returns> public static T ToModel<T>(this DataRow dr) where T : class,new() { return ToModel<T>(dr,true); }
2.将DataRow转换为实体可设置时间格式转换
/// <summary> /// DataRow扩展方法:将DataRow类型转化为指定类型的实体 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="dateTimeToString">是否需要将日期转换为字符串,默认为转换,值为true</param> /// <returns></returns> /// <summary> public static T ToModel<T>(this DataRow dr, bool dateTimeToString) where T : class, new() { if (dr != null) return ToList<T>(dr.Table, dateTimeToString).First(); return null; }
3.将DataTable转换为实体
/// <summary> /// DataTable扩展方法:将DataTable类型转化为指定类型的实体集合 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="dateTimeToString">是否需要将日期转换为字符串,默认为转换,值为true</param> /// <returns></returns> public static List<T> ToList<T>(this DataTable dt, bool dateTimeToString) where T : class, new() { List<T> list = new List<T>(); if (dt != null) { List<PropertyInfo> infos = new List<PropertyInfo>(); Array.ForEach<PropertyInfo>(typeof(T).GetProperties(), p => { if (dt.Columns.Contains(p.Name) == true) { infos.Add(p); } });//获取类型的属性集合 SetList<T>(list, infos, dt, dateTimeToString); } return list; }
4.转换实现代码
private static void SetList<T>(List<T> list, List<PropertyInfo> infos, DataTable dt, bool dateTimeToString) where T : class, new() { foreach (DataRow dr in dt.Rows) { T model = new T(); infos.ForEach(p => { if (dr[p.Name] != DBNull.Value)//判断属性在不为空 { object tempValue = dr[p.Name]; if (dr[p.Name].GetType() == typeof(DateTime) && dateTimeToString == true)//判断是否为时间 { tempValue = dr[p.Name].ToString(); } try { p.SetValue(model, tempValue, null);//设置 } catch { } } }); list.Add(model); }//结束循环 }
C#中DataTable与实体集合通用转换(使用扩展方法)的更多相关文章
-
DataTable与实体类的转换
多年前写的DataTable与实体类的转换,已放github 阅读目录 介绍 起因 代码 UnitTest GitHub 介绍 很多年前一直使用Ado.net,后来慢慢转型到其他的orm,在转型过程中 ...
-
Table转换成实体、Table转换成实体集合(可转换成对象和值类型)
/// <summary> /// Table转换成实体 /// </summary> /// <typeparam name="T">< ...
-
生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间
生成二维码 /// <summary>/// 生成二维码/// </summary>public static class QRcodeUtils{private static ...
-
DataTable与实体类互相转换
/// <summary> /// DataTable与实体类互相转换 /// </summary> /// <typeparam name="T"& ...
-
【转】DataTable与实体类互相转换
原文地址:https://www.cnblogs.com/marblemm/p/7084797.html /// <summary> /// DataTable与实体类互相转换 /// & ...
-
EF Core中如何通过实体集合属性删除从表的数据
假设在数据库中有两个表:Person表和Book表,Person和Book是一对多关系 Person表数据: Book表数据: 可以看到数据库Book表中所有的数据都属于Person表中"F ...
-
.NET/C#中对自定义对象集合进行自定义排序的方法
一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car ...
-
C#中的自动属性、隐式类型var、对象初始化器与集合初始化器、扩展方法
1.自动属性(Auto-Implemented Properties) //以前的写法 .net2.0 private string _userName; public string UserName ...
-
C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询
1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法 ...
随机推荐
-
Paxos算法与Zookeeper分析
1 Paxos算法 1.1 基本定义 算法中的参与者主要分为三个角色,同时每个参与者又可兼领多个角色: ⑴proposer 提出提案,提案信息包括提案编号和提议的value; ⑵acceptor 收到 ...
-
ServerSocket
在网上找ServerSocket看到的解释
-
python学习笔记3(元组、字典)
Python中有三种内置的数据类型.dictionary(字典).List(列表)和tuple(元组). 元组(tuple) 只读列表(列表的值可以修改,元组的不可以) 元组与列表类似,不同之处在于元 ...
-
反射动态创建不同的Processor
1. 定义抽象方法 public abstract class BaseProcesser { public abstract void GetCustomerReportCard ...
-
centos 安装php-fpm , nginx二级域名配置 ,但为什么必须要 域名提供商 哪里解析新的二级域名一下 才能用呢?
yum -y install php-fpm php-mysql(当然还有其它扩展) /etc/init.d/php-fpm restart (重启php-fpm) /etc/php.ini (php ...
-
Linux工具参考篇(网摘)
Linux工具参考篇 原文出处:[Linux Tools Quick Tutorial] 1. gdb 调试利器 2. ldd 查看程序依赖库 3. lsof 一切皆文件 4. ps 进程查看器 5. ...
-
cloudera-manager所有服务提示时钟偏差问题解决办法
今天新部署Cloudera Manager Hadoop(CDH)集群 发现祖国*一片红,所有服务都报时钟偏差 1.查看各服务器,时钟是否正确 发现并无问题 2.查看CDH主机配置----主机时钟偏 ...
-
openwrt如何关掉防火墙?
答: 1. 阻止防火墙服务开机自动启动 /etc/init.d/firewall disable 2. 关闭防火墙 /etc/init.d/firewall stop
-
servlet 执行顺序
public class TestServelt { public static void main(String[] args) { ChildServlet childServlet = new ...
-
day057 基于对象和基于双下划线的多表查询
单表查询和多表查询的添加与查询 上述关系:author-authordetail是一对一的关系(外键在author上名为authors), book-publis ...