C#中DataTable与实体集合通用转换(使用扩展方法)
本案例提供了:把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, 它对程序中的元素进行标注,如类型.字段.方法 ...
随机推荐
- duplicate symbol _OBJC_METACLASS_$ 报错记录
duplicate symbol _OBJC_METACLASS_$_TabbarButton in: /Users/hw201406/Library/Developer/Xcode/DerivedD ...
- ASP.Net 验证控件 CompareValidator
CompareValidator 作用就是比较两个输入框所输入的值是否一致,常用来作为验证输入密码和确认密码的业务. 属性 描述 Operator 比较操作符,可选值DataTypeCheck.Equ ...
- DevExpress使用之ChartControl控件绘制图表(多坐标折线图、柱状图、饼状图)
最近因为公司项目需要用到WinForm的DecExpress控件,在这里把一些使用方法总结一下. DevExpress中有一个专门用来绘制图表的插件ChartControl,可以绘制折线图.饼状图.柱 ...
- WebAPI GET和POST请求的几种方(转发)
WebAPI GET和POST请求的几种方式 GET请求 1.无参数get请求 一般get请求有两种写法,一种是$.get() 一种是$.ajax({type:"get"}), ...
- JavaScript之聊天室设计摸拟
把聊天室的界面先做好,主代码(现在还只能单机模式・_・): window.onload = function(){ var arrIcon = ['http://tva1.sinaimg.cn/cro ...
- Android之开源项目工具库篇
本文转自:http://www.trinea.cn/android/android-open-source-projects-dev-lib/ 本文中你可以找到那些精美App中各种有特性的View,如 ...
- iOS 高阶
1.UIStoryBoard 2. segue跳转传值 3. UIColor配色 //1. 十进制配色 [UIColor colorWithRed:163.0/255.0 green:148.0/25 ...
- sql server 删除表字段和字段的约束
删除数据库表中的字段时,使用了 :alter table 表名 drop column 列名 服务器返回的错误为:Server: Msg 5074, Level 16, State 1, Line 1 ...
- java 自动装箱和自动拆箱
自动装箱 java执行Integer i = 100:编译器编译成Integer i = Integer.valueOf(100); Integer i = 100; //编译器编译成Integer ...
- 解析XML文档之二:使用PULL解析
第一步:解析文档为一下文档 <?xml version="1.0" encoding="UTF-8"?> <students> < ...