使用反射将DataTable的数据转成实体类
利用反射避免了硬编码出现的错误,但是实体类的属性名必须和数据库名字对应(相同)
1、利用反射把DataTable的数据写到单个实体类
/// <summary>
///利用反射把DataTable的数据写到单个实体类
/// </summary>
/// <typeparam name="T">实体类(model)</typeparam>
/// <param name="dtSource">DataTable数据源</param>
/// <returns>返回的实体类对象</returns>
public static T ToSingleEntity<T>(this System.Data.DataTable dtSource) where T : class, new()
{
if (dtSource == null)
{
return default(T);
} if (dtSource.Rows.Count != )
{
Type type = typeof(T);
Object entity = Activator.CreateInstance(type); //创建实例
foreach (System.Reflection.PropertyInfo entityCols in type.GetProperties())
{
if (!string.IsNullOrEmpty(dtSource.Rows[][entityCols.Name].ToString()))
{ Type valType = entityCols.PropertyType;
if (valType.IsGenericType && valType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))//判断convertsionType是否为nullable泛型类
{
//如果type为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(valType);
//将type转换为nullable对的基础基元类型
valType = nullableConverter.UnderlyingType;
}
entityCols.SetValue(entity, Convert.ChangeType(dtSource.Rows[][entityCols.Name], valType), null);
//entityCols.SetValue(entity, dtSource.Rows[0][entityCols.Name], null);
}
}
return (T)entity;
}
return default(T);
}
2、利用反射把DataTable的数据写到集合实体类里
/// <summary>
/// 利用反射把DataTable的数据写到集合实体类里
/// </summary>
/// <typeparam name="T">实体类(model)</typeparam>
/// <param name="dtSource">DataTable数据源</param>
/// <returns>返回IEnumerable的实体类对象</returns>
public static IEnumerable<T> ToListEntity<T>(this System.Data.DataTable dtSource) where T : class, new()
{
if (dtSource == null)
{
return null;
} List<T> list = new List<T>();
Type type = typeof(T);
foreach (System.Data.DataRow dataRow in dtSource.Rows)
{
Object entity = Activator.CreateInstance(type); //创建实例
foreach (System.Reflection.PropertyInfo entityCols in type.GetProperties())
{
if (!string.IsNullOrEmpty(dataRow[entityCols.Name].ToString()))
{
Type valType = entityCols.PropertyType;
if (valType.IsGenericType && valType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))//判断convertsionType是否为nullable泛型类
{
//如果type为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(valType);
//将type转换为nullable对的基础基元类型
valType = nullableConverter.UnderlyingType;
}
entityCols.SetValue(entity, Convert.ChangeType(dataRow[entityCols.Name], valType), null);
}
}
list.Add((T)entity);
}
return list;
}
用法:
static void Main(string[] args)
{
System.Data.DataSet ds = new System.Data.DataSet();
IEnumerable<User> model = ds.Tables[].ToListEntity<User>();
}
使用反射将DataTable的数据转成实体类的更多相关文章
- JavaWeb之如何把请求数据转成实体类
JavaWeb之如何把请求数据转成实体类 自己写个工具类加入下面两个静态方法 自定一个注解类DateTimeFormatting 调用方式User user = util.ObjectFromMap( ...
- 利用反射把DataTable自动赋值到Model实体(自动识别数据类型)
转:http://www.cnblogs.com/the7stroke/archive/2012/04/22/2465591.html using System.Collections.Generic ...
- 泛型集合、datatable常用数据类型转换Json帮助类
泛型集合.datatable常用数据类型转换Json帮助类 using System; using System.Data; using System.Configuration; using Sys ...
- C# 将DataTable数据源转换成实体类
using System; using System.Collections.Generic; using System.Data; using System.Reflection; /// < ...
- Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)
上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...
- 【转】C#中将JSon数据转换成实体类,将实体类转换成Json
http://wo13145219.iteye.com/blog/2022667 http://json2csharp.chahuo.com/ using System; using System.C ...
- xml格式报文的拼装,和解析成实体类
我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道.所有的接口请求.应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下. 拼接xml格式报文. 从页面表单提交和配 ...
- 利用反射将Datatable、SqlDataReader转换成List模型
1. DataTable转IList public class DataTableToList<T>whereT :new() { ///<summary> ///利用反射将D ...
- 使用Sql语句快速将数据表转换成实体类
开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...
随机推荐
- 高速PCB之EMC设计47则
高速PCB之EMC设计47则 差模电流和共模电流 辐射产生 电流导致辐射,而非电压,静态电荷产生静电场,恒定电流产生磁场,时变电流既产生电场又产生磁场.任何电路中存在共模电流和差模电流,差模信号携带数 ...
- sacc scss less
CSS 预处理器技术已经非常的成熟,而且也涌现出了越来越多的 CSS 的预处理器框架.本文向你介绍使用最为普遍的三款 CSS 预处理器框架,分别是 Sass.Less CSS.Stylus. 首先我们 ...
- hdu acm 2082 找单词
找单词 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 虚拟机安装Ubuntu到U盘
这篇经验中特指系统安装到U盘,系统在U盘上,不是双系统,不会改变源系统的设置.只需在启动的时候选择启动路径,就可以从U盘启动你的系统.本文仅仅Ubuntu系统,举一反三可以按照此方法安装各种各样的系统 ...
- ubuntu上搭建review board代码评审站点
Reviewboard是一个开源个人可以免费使用的代码评审框架,貌似现在有越来越多的公司也开始使用reviewboard作为公司的代码评审工具. 今天早上试了一下,搭建过程非常方便简单,按照网页提示即 ...
- css长度值与颜色值
颜色值 在网页中的颜色设置是非常重要的,有字体颜色,背景颜色,边框颜色等,设置颜色的方法也有很多种: 1.英文命令颜色 p{color:red;} 2.rgb颜色 p{color:rgb(133,45 ...
- javascript replace正则替换时调用函数替换的使用
以下函数将替换英文方式下的单引号和双引号,当然change函数编写决定了你要替换什么? String.prototype.repSpecChar=function() { ...
- 开源库Magicodes.ECharts使用教程
目录 1 概要 2 2 Magicodes.ECharts工作原理 3 2.1 架构说明 3 2.1.1 Axis 4 2.1.2 CommonD ...
- ASP.Net MVC的ViewBag一个坑,不要跳进去
如鹏的学习管理系统是使用ASP.net MVC 5开发的,今天一个新版本发布后网站出现一个Bug,学生在下拉列表中选中的项再加载显示的时候发现仍然没被选中.详细一点说吧:假如有这样一个Action: ...
- ios设备mdm的实现过程
一)配置IIS加密连接,ios系统升级7.1后已经无法使用http进行企业内部署,为了满足mdm的加密需求以及大厅的初始化安装需要进行生成自签名证书 1)配置MIMEcer application/x ...