DataTable和DataRow利用反射直接转换为Model对象的扩展方法类
DataTable和DataRow利用反射直接转换为Model对象的扩展方法类

/// <summary>
/// 类 说 明:给DataTable和DataRow扩展方法,直接转换为对象集合或对象
/// 编 码 人:程晨旭
/// 联系方式:Email:97391519@qq.com
/// Blog:http://www.chengchenxu.com
/// 修改日期:2018-02-28
/// 补充说明:此扩展类可以极大的简化操作,但是性能低下,大数据以及高性能要求下慎用.
/// 此类如果放到asp.net的App_Code文件夹下会有编译错误,放到其他地方则无此问题
/// </summary>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Reflection;
namespace ChengChenXu.DataTableExtensions
{
public static class DataTableExtensions
{
/// <summary>
/// 把DataRow直接转换成对应的实体对象,给DataRow添加一个扩展方法,方便使用.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dr"></param>
/// <returns></returns>
public static T ToModel<T>(this DataRow dr)
{
T t = Activator.CreateInstance<T>();
// 利用反射获得此模型的公共属性
string attributeName = String.Empty;
PropertyInfo[] propertys = t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
attributeName = pi.Name;
// 检查DataTable是否包含此列
//此处要求DataRow的列名称要和对象属性名称一致
//注意:此处大小写不敏感
if (dr.Table.Columns.Contains(attributeName))
{
// 判断此属性是否为只读(不包含set构造)
if (!pi.CanWrite) { continue; }
//给属性赋值
var value = dr[attributeName];
if (value != DBNull.Value)
{
pi.SetValue(t, value, null);
}
}
}
return t;
}
/// <summary>
/// 将DataTable直接转化为对象集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt"></param>
/// <returns></returns>
public static List<T> ToModelList<T>(this DataTable dt)
{
List<T> list = new List<T>();
//调用ToModel方法添加List
for (int i = 0; i < dt.Rows.Count; i++)
{
T t = Activator.CreateInstance<T>();
t = dt.Rows[i].ToModel<T>();
list.Add(t);
}
return list;
}
}
}
使用方法:直接引用命名空间之后可以直接使用该方法
public List<LinkModel> GetLinkList()
{
DataTable dt = SqlServerHelper.ExecuteDataTable("select * from MVC_Link order by showOrder ASC ");
return dt.ToModelList<LinkModel>();
}
public LinkModel GetLink(int id)
{
string sql = "select * from MVC_Link where id = @id";
SqlParameter[] parameters = SqlServerHelper.CreatParameters(
new string[] { "id" },
new object[] { id }
);
DataTable dt = SqlServerHelper.ExecuteDataTable(sql, parameters);
if(dt.Rows.Count==0) return Null; else return dt.Rows[0].ToModel<LinkModel>();
}

点击直接下载类文件:
本文为博主原创,转载请保留出处:
http://www.chengchenxu.com/Article/10/
DataTable和DataRow利用反射直接转换为Model对象的扩展方法类的更多相关文章
- 【转】利用反射快速给Model实体赋值
原文地址:http://blog.csdn.net/gxiangzi/article/details/8629064 试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有 ...
- 利用反射快速给Model实体赋值
试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...
- 利用反射快速给Model实体赋值 使用 Task 简化异步编程 Guid ToString 格式知多少?(GUID 格式) Parallel Programming-实现并行操作的流水线(生产者、消费者) c# 无损高质量压缩图片代码 8种主要排序算法的C#实现 (一) 8种主要排序算法的C#实现 (二)
试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...
- java利用反射交换两个对象中的字段相同的字段值
有时候我们的两个对象字段都是一样的,只有极少的区别,想要把一个对象字段的值,赋值给另外一个对象值 然后传给另外一个方法使用,但是这个字段太多,一个一个的复制太过繁琐. 这时候利用反射解决这个问题. c ...
- 利用反射,更改string对象的value数组以达到改变string值。
package test; import java.lang.reflect.Field; import lombok.Value; public class Test1{ public static ...
- 【Java】利用反射执行Spring容器Bean指定的方法,支持多种参数自动调用
目录 使用情景 目的 实现方式 前提: 思路 核心类 测试方法 源码分享 使用情景 将定时任务录入数据库(这样做的好处是定时任务可视化,也可以动态修改各个任务的执行时间),通过反射执行对应的方法: 配 ...
- model对象之setter方法使用,解决去除空格和将数字转成字符串展示方法
1.系统中手机号注册的时候,不能含有前后空格.在model对象中过滤~! private String mobile; public String getMobile() { return mobil ...
- Spring中利用applicationContext.xml文件实例化对象和调用方法
Spring中实例化对象和调用方法入门 1.jar包和xml的准备 已上传至百度云盘,链接: https://pan.baidu.com/s/1CY0xQq3GLK06iX7tVLnp3Q 提取码: ...
- Android MVP 利用rxjava 避免向Model传入监听方法
传统的MVP: 1.抽离出View的接口,即ILoginView. 2.抽离Model的接口,即ILoginModel. 3.抽离Presenter的接口,即ILoginPresenter. 4.实现 ...
随机推荐
- Jenkins+GitHub+maven
介绍: http://192.168.193.128:8115/jenkins/ 用户名:admin密码:admin电子邮箱:admin@admin.com root/12345678添加新用户: t ...
- Welcome-to-Swift-11方法(Methods)
方法是由特定类型关联起来的函数.类.结构体和枚举都能定义成实例方法.它封装了特定的任务和给定类型的实例的功能函数.类,结构体和方法也能定义类型方法,它只与类型的本身由关联.类型方法和Objective ...
- RobotFramwork自定义库
这么长时间才知道有RobotFramwork这东西... 感叹之前都干啥去了,感叹公司为啥不用这货? 网上的安装文档都有,就不用自己在记录啦. 感觉在实际实用时,肯定要有自己定义的库啊,不能只用bui ...
- C++ 错误解决 —— internal compiler error
问题: g++ 编译时,报错: g++: internal compiler error: Killed (program cc1plus) 出错原因: 出错的原因是(虚拟机)运行内存不足,而大量te ...
- social-auth-app-django模块
一 原文地址:http://www.cnblogs.com/adc8868/p/7665864.html social-auth-app-django模块是专门用于Django的第三方登录OAuth2 ...
- Sphinx的GEO距离搜索 [转载]
近项目用sphinx做地理搜索,可是结果总是不对,明明很近却搜不到 结果检查sphinx源文件: static inline double sphSqr ( double v ) { return v ...
- LeetCode OJ--Median of Two Sorted Arrays ***
http://oj.leetcode.com/problems/median-of-two-sorted-arrays/ 找两个有序数组的中位数,因为有序数组,并且复杂度要求O(lg(m+n))所以想 ...
- 如何解决div里面img图片下方有空白的问题?
空白产生原因: 图片默认的vertical-align是baseline,(元素放置在父元素的基线上,也就是xx下边距) 一个inline-block元素,如果里面没有inline元素,或者overf ...
- Codeforces 934 A.Compatible Pair
http://codeforces.com/contest/934 A. A Compatible Pair time limit per test 1 second memory limit p ...
- 找小于N 的所有质数
笔试题目当中,找素数出现的几率有点大.昨天就做了一个,感觉不是很难,但可以考查程序员的数学和编码功底. 用嵌套循环来实现是很理想的,怎样减少循环的次数?怎样求出小于N的所有质数? 不可能将一个数除与所 ...