博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用反射将DataTable的数据转成实体类
阅读量:5951 次
发布时间:2019-06-19

本文共 4013 字,大约阅读时间需要 13 分钟。

利用反射避免了硬编码出现的错误,但是实体类的属性名必须和数据库名字对应(相同)

1、利用反射把DataTable的数据写到单个实体类

///         ///利用反射把DataTable的数据写到单个实体类        ///         /// 
实体类(model)
/// DataTable数据源 ///
返回的实体类对象
public static T ToSingleEntity
(this System.Data.DataTable dtSource) where T : class, new() { if (dtSource == null) { return default(T); } if (dtSource.Rows.Count != 0) { Type type = typeof(T); Object entity = Activator.CreateInstance(type); //创建实例 foreach (System.Reflection.PropertyInfo entityCols in type.GetProperties()) { if (!string.IsNullOrEmpty(dtSource.Rows[0][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[0][entityCols.Name], valType), null); //entityCols.SetValue(entity, dtSource.Rows[0][entityCols.Name], null); } } return (T)entity; } return default(T); }

 

 

2、利用反射把DataTable的数据写到集合实体类里

1         ///  2         /// 利用反射把DataTable的数据写到集合实体类里 3         ///  4         /// 
实体类(model)
5 /// DataTable数据源 6 ///
返回IEnumerable的实体类对象
7 public static IEnumerable
ToListEntity
(this System.Data.DataTable dtSource) where T : class, new() 8 { 9 if (dtSource == null)10 {11 return null;12 }13 14 List
list = new List
();15 Type type = typeof(T);16 foreach (System.Data.DataRow dataRow in dtSource.Rows)17 {18 Object entity = Activator.CreateInstance(type); //创建实例 19 foreach (System.Reflection.PropertyInfo entityCols in type.GetProperties())20 {21 if (!string.IsNullOrEmpty(dataRow[entityCols.Name].ToString()))22 {23 Type valType = entityCols.PropertyType;24 if (valType.IsGenericType && valType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))//判断convertsionType是否为nullable泛型类 25 {26 //如果type为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换 27 System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(valType);28 //将type转换为nullable对的基础基元类型 29 valType = nullableConverter.UnderlyingType;30 }31 entityCols.SetValue(entity, Convert.ChangeType(dataRow[entityCols.Name], valType), null);32 }33 }34 list.Add((T)entity);35 }36 return list;37 }

 

 

用法:

1          static void Main(string[] args)2         {3             System.Data.DataSet ds = new System.Data.DataSet();4             IEnumerable
model = ds.Tables[0].ToListEntity
();5 }

 

转载于:https://www.cnblogs.com/linJie1930906722/p/5555928.html

你可能感兴趣的文章
Scrum团队开发
查看>>
【C#公共帮助类】分页逻辑处理类
查看>>
关于最短路的随笔
查看>>
css 伪元素
查看>>
url-pattern配置
查看>>
springmvc管理资源开放
查看>>
成为Java顶尖程序员 ,看这11本书就够了
查看>>
新手入门学习(一)
查看>>
day10 nfs服务,nginx负载均衡,定时任务
查看>>
linux概念之/dev/shm
查看>>
shell之条件表达式
查看>>
实例!软件缺陷数据度量和分析
查看>>
sql performance Kill Lock
查看>>
php上传视频html代码,HTML_html5拍照功能实现代码(htm5上传文件),1、 视频流HTML5 The Media Capture - phpStudy...
查看>>
php intelephense,vsCode 使用 PHP Intelephense插件函数跳转跟踪
查看>>
mysql 日期小时,如何从MySQL中的日期时间减去3小时?
查看>>
mysql存储过程批量多表删除,[mysql]表批量操作的存储过程
查看>>
linux界面如何配置永久路由,linux 添加永久路由的几种方法。
查看>>
c语言程序设计 平时作业,20春学期《C语言及程序设计》在线平时作业1答卷.txt...
查看>>
linux搭建nfs实验报告,Linux配置NFS服务【实验】
查看>>