博客
关于我
C#反射在ADO中的巧用
阅读量:442 次
发布时间:2019-03-06

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

     在C#原生开发网站的时候,经常会碰到一个问题,后台用原生查出来的数据一般是DataReader或者是DataTable,这样就把数据从数据库中拿到了,然后就是把数据绑定到前台页面进行输出,这是最原生态的开发了。然后慢慢的接触到了三层架构了,一番流程下来后,感觉三层架构相比之下确实是规范了不少,先从数据库说,原来从数据库查出来返回到内存的是一个DataTable,然后在前台进行解析解析再解析,DataTable -- Column --- Row -- Cells ,在三层架构呢 ,返回一个List<>集合,我把它叫做对象数组,就是存放一种对象类型的集合,我们都知道List<>集合实现了IEumerable这个接口,SO,我们可以用foreach了然后调用model的属性,进行输出,上代码:

 

foreach (var item in List
) { Response.Write(item.id); }

  

那么问题来了,DataTable <-----> Model 这个转化改怎么进行呢,刚开始有一种笨方法,就是先把DataTable循环出来,然后再给Model实体的属性依次赋值,然后就这时的数据就变成了Model 里面的属性了,是不是特笨,后来老师讲了反射,然后就想到了这个方法,以前一大堆代码的事,现在一个方法搞定,先大概看下代码:

 

public static List
Map
(DataTable dt) where FanShe :class,new() { List
list = new List
(); var prop = typeof(FanShe).GetProperties(); int count = dt.Rows.Count; for (int i = 0; i < count; i++) { FanShe f = new FanShe(); foreach (var item in prop) { item.SetValue(f,dt.Rows[i][item.Name],null); } list.Add(f); } return list; }

这样就省事多了,DataDable ----> Map<>() ---->Model ,传入方法一个DataTable然后就你直接拿个List<User> users 接收就ok了,是不是很爽,其实效率就是这样慢慢高起来的,有些很繁琐和重复的东西,如果能够有一种自动化的方案去解决的,那肯定是绝佳了,好了,先分析下代码:

为什么DataTable能转化成Model实体呢 ,其实稍微想一下,就明白了,DataTable中的行和列,对应的就是Model实体的属性和Count,然后在经过C#的反射,方法就成了。

 

public static List
Map
(DataTable dt) where FanShe :class,new()

方法后面的这个Where是方法的约束,具体就不多说了

 

var prop = typeof(FanShe).GetProperties();

  这一句先拿到FanShe的数据类型,他可以是User 也可以是Student ,调用方法拿到这个类型class的所有属性,prop是一个属性的数组,然后思路就有了

item.SetValue(f,dt.Rows[i][item.Name],null);

先foreach prop这个属性集合,拿到的就是Id,Name,Tiele之类的,然后在Foreach DataTable,DataTa的取值可以是 Dt.Rows[0] 也可以是Dt.Rows["Id"] ,正是利用第二种方法,属性名和DataTable的行的名字相同,然后就是for循环,走了一圈又一圈,这样Model实体就出来了。

 

转载地址:http://igeyz.baihongyu.com/

你可能感兴趣的文章
MySQL 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>