背景介绍

C#中实体类的操作十分简便,一般情况下不需要涉及ADO.NET,如果需要将实体类转化为Datatable,这个时候就需要手动写一个方法了,代码如下图所示:

    public static class IEnumerableExtention{/// <summary>/// 将实体类转化为Datatable/// </summary>/// <typeparam name="T">实体类类型</typeparam>/// <param name="_ienu">实体对象</param>/// <param name="_tableName">表名</param>/// <returns>转化成的DataTable</returns>public static DataTable ToDataTable<T>(this IEnumerable<T> _ienu, string _tableName = "tableFromList") where T : new(){DataTable resultTable = new DataTable(_tableName);var pi = typeof(T).GetProperties(BindingFlags.Public|BindingFlags.Instance|BindingFlags.DeclaredOnly).ToList();if (_ienu == null || pi == null || pi.Count == 0){//当实体类为空的时候返回空的DataTable}else{pi.ForEach(p => { resultTable.Columns.Add(p.Name, p.PropertyType); });//生成Datatable列及列属性foreach (var _ie in _ienu){var dr = resultTable.NewRow();foreach (var prop in pi){if (prop.GetMethod != null){dr.SetField(prop.Name, prop.GetValue(_ie));}}resultTable.Rows.Add(dr);}}return resultTable;}/// <summary>/// 将实体类转化为DataSet/// </summary>/// <typeparam name="T">实体类类型</typeparam>/// <param name="_ienu"><实体对象/param>/// <param name="_tableName">表名</param>/// <returns>转化成的DataSet</returns>public static DataSet ToDataSet<T>(this IEnumerable<T> _ienu, string _tableName = "tableFromList") where T : new(){DataSet ds = new DataSet();ds.Tables.Add(_ienu.ToDataTable(_tableName));return ds;}/// <summary>/// 将实体类的对象列表复制给另一个类型相同的实体类/// </summary>/// <typeparam name="T">源实体类对象类型</typeparam>/// <param name="_ienu">源实体类</param>/// <returns>返回的实体类</returns>public static IEnumerable<T> Copy<T>(this IEnumerable<T> _ienu) where T : new(){var resultLists = new List<T>();var pi = typeof(T).GetProperties(BindingFlags.Instance|BindingFlags.Public|BindingFlags.DeclaredOnly).ToList();if (null == _ienu || null == pi || pi.Count == 0){//源实体类对象为空则返回空实体类}else{foreach (var _ie in _ienu){var resultList = new T();foreach (var prop in pi){if (prop.SetMethod != null && prop.GetMethod != null && !prop.PropertyType.IsAbstract){prop.SetValue(resultList,prop.GetValue(_ie));}}resultLists.Add(resultList);}}return resultLists;}/// <summary>/// 将一个实体类对象列表复制给另一个类型相同的实体类,支持筛选/// </summary>/// <typeparam name="T">源实体类对象类型</typeparam>/// <param name="_ienu">源实体类</param>/// <param name="_predicate">筛选的委托</param>/// <returns></returns>public static IEnumerable<T> Copy<T>(this IEnumerable<T> _ienu, Func<T, bool> _predicate = null) where T:new(){var resultLists = new List<T>();var pi = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly).ToList();if (null == _ienu || null == pi || pi.Count == 0){//源实体类对象为空则返回空实体类}else{if (_predicate != null){_ienu = _ienu.Where(_predicate);}else{foreach (var _ie in _ienu){var resultList = new T();foreach (var prop in pi){if (prop.SetMethod != null && prop.GetMethod != null && !prop.PropertyType.IsAbstract){prop.SetValue(resultList, prop.GetValue(_ie));}}resultLists.Add(resultList);}}}return resultLists;}/// <summary>/// 将一个实体类对象列表复制给另一个类型不相同的实体类,支持筛选,只复制名称和类型都相同的属性/// </summary>/// <typeparam name="TSource">源实体类类型</typeparam>/// <typeparam name="TResult">目标实体类类型</typeparam>/// <param name="_ienu">源实体类</param>/// <param name="_predicate">筛选的委托</param>/// <returns>返回的实体类</returns>public static List<TResult> CopyTo<TSource, TResult>(this IEnumerable<TSource> _ienu, Func<TSource, bool> _predicate = null) where TResult : new(){var resultLists = new List<TResult>();if (_ienu == null){throw new ArgumentNullException(nameof(_ienu));}var piSource = typeof(TSource).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly).ToList();//获取来源实体类属性var piResult = typeof(TResult).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly).ToList();//获取返回实体类属性if (piSource == null || piSource.Count == 0 || piResult == null || piResult.Count == 0){//返回空实体类return resultLists;}if (null != _predicate){_ienu = _ienu.Where(_predicate);}if (_ienu.Count() > 0)//判断来源实体类中列表数量{List<Tuple<PropertyInfo, bool>> PropLists = new List<Tuple<PropertyInfo, bool>>();piResult.ForEach(p =>{if (piSource.Exists(q => q.Name.Equals(p.Name))){PropLists.Add(Tuple.Create(p, p.PropertyType.Equals(piResult.FirstOrDefault(q => q.Name.Equals(p.Name)).PropertyType)));}});foreach (var _ie in _ienu){var resultList = new TResult();var samePropLists = PropLists.Where(p => p.Item2 == true).ToList();//提取类型也相同的属性foreach (var prop in samePropLists){if (prop.Item1.GetMethod != null && _ie.GetType().GetProperty(prop.Item1.Name).SetMethod != null){var value = piSource.FirstOrDefault(p => p.Name.Equals(prop.Item1.Name)).GetValue(_ie);prop.Item1.SetValue(resultList, value);}}resultLists.Add(resultList);}}return resultLists;}}

IEnumerableExtention类中包含五个方法:第一个直接将实体类转化为Datatable,第二个是在第一个的基础上包了一层DataSet并返回。第三个和第四个是将实体类列表复制给类型相同的另一个实体类,第四个支持筛选。第五个是将实体类复制给类型不相同的实体类,但是只支持复制类型和名字都相同的属性。

C#利用反射将实体类ListT转化为Datatable相关推荐

  1. C#利用反射实现实体类ListT索引器

    相关背景: 在项目开发中,我们经常会自定义一些实体类,在某些需要动态赋值的功能中,我们无法知道到下一个需要赋值的字段名称是什么,只知道会从其他返回需要赋值的字段名称和值,这时候就需要实现索引器了,就像 ...

  2. java 反射获取实体类_Java 通过反射给实体类赋值操作

    表单提交这个方法是挺方便的,但在java来说就显得有些麻烦了, 怎么个麻烦呢,就是当你字段多的时候,你就得一个一个的获取其对应的值,这样代码量就多了起来,其代码量不说,维护也是一个问题. 所以就有了这 ...

  3. 利用反射技术修改类中的字段(成员变量的反射)

    题目:利用反射技术修改类中的字段及成员变量的反射 作者:Vashon 一.首先定义一个类如下: class ReflectPoint {private int x; //私有的public int y ...

  4. 利用反射动态实例化类执行方法并传值

    /// <summary>         /// 利用反射动态实例化类执行方法并传值         /// </summary>         /// <param ...

  5. C#利用反射将Datatable转化为指定实体类ListT

    背景介绍 在软件开发中肯定免不了和数据库打交道,我们对数据的增删改查最终会转化为SQL在数据库中执行.从SQLServer中查出数据一般有两种方式:一是ADO.NET直接写SQL语句从数据中查出数据, ...

  6. 利用dom4j将实体类转换为对应的xml报文

    利用dom4j生成xml报文 目标格式: <?xml version="1.0" encoding="GBK"?><Packet type=& ...

  7. java反射获取实体类_java 反射获取类对象的三种方式

    Java反射经常用到的就是获取对象中的属性,那么Java获取类对象就是必不可少的啦! Java实体类: public class ReflexModel { private String code; ...

  8. (C#)利用反射动态调用类成员[转载]

    使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember(    string name ...

  9. 利用反射动态调用类成员C#

    使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember(    string name ...

最新文章

  1. sql server T-SQL 基础
  2. 系统架构设计师教程学习随笔 (计算机与网络基础知识--操作系统基础知识)
  3. [LoadRunner]UTF8字符格式
  4. 第十八期:网页禁止复制粘贴怎么办?教你六招轻松搞定
  5. 华为云发布【云巢】智慧康养物联网加速器,加入立享多项扶持
  6. AI 芯片崛起!FPGA 工程师的核心竞争力在哪里?
  7. Spring Cloud Alibaba Nacos之服务注册中心
  8. ThreadLocal源码学习
  9. 双线macd指标参数最佳设置_手机mt4平台怎么使用macd双线指标
  10. 软件项目管理期末复习(看这一篇就够了)
  11. java仿qq登陆界面
  12. 基于原生小程序精仿的猫眼电影(可预览)
  13. 联想笔记本电脑桌面出现计算机白色长条边,笔记本电脑屏幕出现条纹闪烁怎么解决【解决方法】...
  14. matlab颜色直方图特征提取,灰度直方图特征提取的Matlab实现
  15. 玩游戏蓝牙耳机哪款好?适合打游戏的无线蓝牙耳机推荐
  16. 为什需要采用增广拉格朗日函数
  17. 静心戒躁--半个学期来的小结
  18. python中将数据写入excel
  19. C语言 ltoa sprintf strcat
  20. 终于还是对B站动漫动手了!【数据可视化分析】

热门文章

  1. 前端路由的两种实现原理
  2. 二分查找和二叉查找树
  3. C++primer习题--第3章
  4. uboot启动 及命令分析(3)
  5. FreeMarker笔记 前言第1章 入门
  6. CAD/CAM/CNC行业常用功能解决方式
  7. vim高级技巧(split)_小花_新浪博客
  8. 通过计算机网络进行的商务活动包括,电子商务练习题及答案
  9. Mybatis源码阅读(二):动态节点解析2.2 —— SqlSourceBuilder与三种SqlSource
  10. Android 通过WIFI状态监听广播,判断进入指定wifi范围