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

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

  

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

public static List<FanShe> Map<FanShe>(DataTable dt) where FanShe :class,new()
{
List<FanShe> list = new List<FanShe>();
var prop = typeof(FanShe).GetProperties();
int count = dt.Rows.Count;
for (int i = ; 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<FanShe> Map<FanShe>(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实体就出来了。

C#反射在ADO中的巧用的更多相关文章

  1. 反射在ADO.NET方面的应用

    本来说通过传统的方式可以很方便的访问数据库不需要用到反射技术,但是为了将反射在ADO.NET中的作用体现出来,特意来试一下改良版的访问方式. ​反射的学习需要一定的时间去理解,我学了有一阵子了,但也不 ...

  2. CocosCreator反射在Android中的使用

    CocosCreator反射在Android中的使用 新建一个CocosCreator项目,然后点击构建 构建完成之后,即可用AndroidStudio打开构建的项目 使用AndroidStudio打 ...

  3. 简述在ADO中使用接口的抽象数据提供程序以及ADO.NET数据提供程序工厂模型

    如何在ADO中使用接口的抽象数据提供程序 在cofig中 appSettings下,配置数据连接类型 <appSettings> <!--这个键值映射到枚举值中的某个值--> ...

  4. 怎样利用ADO中的adoquery进行缓存更新?????(100分)

    我用BDE时,用query与updatesql相结合进行缓存更新,但是在ADO中没有updatesql,只有用adoquery,在DBGRID中,用CANCELUPADTE,只能取消一条记录,烦恼不已 ...

  5. ADO中最重要的对象有三个:Connection、Recordset和Command

    ConnectionPtr: _ConnectionPtr m_pConnection; HRESULT hr; try{ hr = m_pConnection.CreateInstance(_uui ...

  6. 使用反射获取类中的属性(可用于动态返回PO类的列,当做表格的表头)

    //利用反射取类中的属性字段 try { Class clazz = Class.forName("houji.bean.model.TaskModel"); Field[] fi ...

  7. 反射在ADO.NET中的运用(你还在每个项目中循环遍历DataTable吗)

    图片有点大哈,但大更能说明问题.您是不是每个项目都在重复的做图片中的事情-----循环把数据库中返回的表转化为实体对象.是不是每次都在抱怨这样的重复工作.字段越多抱怨越多!不用抱怨了.当你看到这篇文章 ...

  8. .Net开发笔记(二十一) 反射在.net中的应用

    反射概念在网上到处都有,但是讲到的具体的应用很少,一个重要的原因是现实中真的很少用得到它.引用msdn上对“反射”的解释: "通过 System.Reflection 命名空间中的类以及 S ...

  9. 通过反射获取父类中的泛型参数对应的Class对象

    假设有两个类:Dao 和 PersonDao,它们的代码如下: Dao: public class Dao<T> { private Class<T> clazz; T get ...

随机推荐

  1. 解决IE兼容模式问题

    IE浏览器从IE8开始添加了兼容模式,开启后会以低版本的IE进行渲染.在浏览网页时候会出现网页显示问题,于是可以在html中加入以下代码来使IE使用固定的渲染模式: <metahttp-equi ...

  2. 【转载】实用的Javascript获取网页屏幕可见区域高度

    本文转载原地址:这里 document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 docu ...

  3. Java的一些常见问题,JRE,JDK,JVM,包等概念理解

    Java常见错误: 文件名字应该与文件中public类的名字相同 public static void main(String[] args); 如何定位错误和解决错误. JVM,JRE,JDK解释和 ...

  4. Imperva WAF使用笔记

    添加IP白名单 在对自己公司网站进行安全测试时会被WAF拦截,如果把WAF彻底停掉就无法拦截到外部的攻击了. 此时可以添加IP地址白名单,白名单内的IP对网站发起扫描时不会做拦截.

  5. iOS证书和描述文件

    iOS有两种证书和描述文件: 证书类型 使用场景 开发(Development)证书和描述文件 用于开发测试,在HBuilder中打包后可在真机环境通过Safari调试 发布(Distribution ...

  6. AMD规范与CMD规范的区别是什么?

    AMD规范与CMD规范的区别是什么?    在比较之前,我们得先来了解下什么是AMD规范?什么是CMD规范?当然先申明一下,我个人也是总结下而已,也是网上看到的资料,自己总结下或者可以说整理下而已,供 ...

  7. iOS 10 都有什么改变?

    iOS 10 都有什么改变? 看这一个贴就够了 最全面的试用 苹果在 WWDC 2016 发布会上正式发布了 iOS 10 操作系统,iOS 与 macOS.tvOS 和 watchOS 构建了苹果四 ...

  8. 敏捷遇上UML——软创基地马年大会(深圳站 2014-3-15)

    邀请函: 尊敬的阁下: 我们将在深圳为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战 ...

  9. Symantec Backup Exec 2012 Agent for Linux 卸载

    本文介绍一下如何卸载Symantec Backup Exec 2012 Agent for Linx.首先我们来看看Symantec_Backup_Exec2012管理员手册的文档介绍: 卸载 Age ...

  10. MS SQL 监控错误日志的告警信息

    SQL Server的错误消息(Error Message)按照消息的严重级别一共划分25个等级,级别越高,表示严重性也越高.但是如果你统计sys.messages,你会发现,实际上只有16(SQL ...