使用反射将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 ...
随机推荐
- python面向对象中的__init__方法怎么理解?
我们在学习python类的时候,总会碰见书上的类中有__init__()这样一个函数,很多同学百思不得其解,其实它就是python的构造方法. 构造方法类似于类似init()这种初始化方法,来初始化新 ...
- R语言中的logical(0)和numeric(0)以及赋值问题
logical(0) 不等于 numeric(0).两者都不等于NULL值,即is.null(logical(0))和is.null(numeric(0))返还值都是FALSE.这很有意思,说明长度为 ...
- express 转
目录 此文重点介绍Express3.0的开发框架,其中还会涉及到Mongoose,Ejs,Bootstrap等相关内容.Express已经升级到4.x,请同时参考文章,Node.js开发框架Expre ...
- 使用IConfigurationSectionHandler在web.config中增加自定义配置
一. 场景 这里仅举一个简单应用的例子,我希望在web.config里面增加网站的基本信息,如:网站名称,网站版本号,是否将网站暂时关闭等.二. 基本实现方法1. 定义配置节点对应的类:Site ...
- WebView的基本使用方法
WebView是View的子类,它主要用来显示网页的. 因为我们要用到网络,所以需要先添加权限:在 Anroidmanifest <manifest ... > <uses-perm ...
- EJB概念理解
转自http://blog.csdn.net/jojo52013145/article/details/5783677 1. 我们不禁要问,什么是"服务集群"?什么是"企 ...
- cocos2d-x项目实现android视频播放参考链接
http://blog.csdn.net/xiaominghimi/article/details/6870259 http://blog.csdn.net/kaitiren/article/deta ...
- [XAF] How to set List View Columns Title Customization align center?
https://www.devexpress.com/Support/Center/Question/Details/T423138
- linux配置本地源
yum本地源配置 标签: centosplugins网络file虚拟机linux 2011-10-09 21:40 12093人阅读 评论(1) 收藏 举报 分类: linux yum 在网上找了很 ...
- fallacies of distributed computing
The network is reliable. Latency is zero. Bandwidth is infinite. The network is secure. Topology doe ...