使用反射将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 ...
随机推荐
- android调用系统相机并获取图片
如果不是特别的要求,通过拍照的方式取得图片的话,我们一般调用系统的拍照来完成这项工作,而没必要再自己去实现一个拍照功能.调用系统相机很简单,只需要一个intent就可以跳转到相几界面,然后再通过onA ...
- 用sql语句清除日志
DUMP TRANSACTION [数据库] WITH NO_LOGBACKUP LOG [数据库] WITH NO_LOGDBCC SHRINKDATABASE([数据库])
- EasyUI需注意的问题01
一.EasyUI-Datagrid分页 在创建数据表格(DataGrid)的时候,通过设置'pagination' 属性为 true,可以在数据表格的底部生成一个分页工具栏. <table id ...
- WPF控件经验小结:(1) ToolBar去掉右边箭头(扩展图标)
今天开发时,同事问我一个问题.怎么去除ToolBar右边扩展图标.我想了一下,说改Style.同事说太麻烦了.可不可以快速修正.我说应该动态去读取Template模板中的Style,然后隐藏.怎么实现 ...
- CSAPP读书随笔之一:为什么汇编器会将call指令中的引用的初始值设置为-4
CSAPP,即<深入理解计算机系统:程序员视角>第三版,是一本好书,但读起来确需要具备相当的基本功.而且,有的表述(中译文)还不太直白. 比如,第463页提到,(对于32位系统)为什么汇编 ...
- Vue.js多重组件嵌套
Vue.js多重组件嵌套 Vue.js中提供了非常棒的组件化思想,组件提高了代码的复用性.今天我们来实现一个形如 <app> <app-header></app-head ...
- Eclipse无法启动错误之Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini)
悲剧,在安装Android Build Tools时,提醒需要关闭Eclipse进行安装,于是我在Tools安装完成后重启了Eclipse.但是Eclipse却无法启动,在log中有如下提示: Una ...
- FSM 浅谈
之前写过一篇关于状态机的,上一篇讲过的我也就不再罗嗦了,不知道欢迎去查看我的上一篇随笔,主要是感觉上次自己封装的还是不行,所以又进行修改了一番! 我本人是个菜鸟,最开始接触状态机的时候,状态机一个可厉 ...
- Linux之RPM安装软件
源码包 (可以看到源代码) 脚本安装包(写好的xsheel一键安装.本质还是源码包和二进制包) 二进制包(RPM包.系统默认包) 包管理系统简单,通过命令就可以安装.卸载 ...
- VS2012 编译带有c/c++代码的python模块失败解决方案
python2.7默认编译带有/c++代码的模块/包是使用VS2008环境变量,所以为了可用,我们要在编译前设置环境变量 SET VS90COMNTOOLS=%VS110COMNTOOLS% 但有时只 ...