在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 = 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<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实体就出来了。

转载于:https://www.cnblogs.com/myshowtime/p/5392109.html

C#反射在ADO中的巧用相关推荐

  1. 【Android 逆向】加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程

    文章目录 一.加壳的 Android 应用启动流程 二.使用反射替换 LoadedApk 中的类加载器流程 一.加壳的 Android 应用启动流程 加壳的 Android 应用启动流程 : 加壳的 ...

  2. 物理光学4 反射与折射中的一些特殊现象

    物理光学4 反射与折射中的一些特殊现象 第一种情况:n1<n2n_1<n_2n1​<n2​ 也就是入射端的折射率小于折射端的折射率(也就是从光疏介质到光密介质,可以类比从空气中传播到 ...

  3. Java中的反射和Java中的访问修饰符

    什么是反射? ①在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性 ②对于任何一个对象,我们都能够对它的方法和属性进行调用 总而言之:它反射Java语言中的一种机制,通过这种机制可以动 ...

  4. php 反射类,PHP中的反射类

    这篇文章介绍的内容是关于PHP中的反射类 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 PHP的反射类ReflectionClass.ReflectionMethod使用实例 作者: ...

  5. 反射在java中的应用_java反射机制在项目中的运用

    定义:Reflection是java开发语言特性之一,它允许运行中的java程序对自身进行检测,自审,并能操作程序内部的属性和方法,Reflection是java被视为动态语言关键之一.允许程序从执行 ...

  6. java为何重复调用方法_通过反射调用Java中的getter:重复调用它的最快方法是什么(在性能和可伸缩性方面)?...

    小编典典 您可以使用MethodHandle.其Javadoc写道: 使用Lookup API中的工厂方法,可以将Core Reflection API对象表示的任何类成员转换为行为等效的方法句柄.例 ...

  7. Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?

    文章目录 前言 一.私有方法在本类中直接调用 1.1.在本类中实例化,调用私有方法 1.2.尝试在其他类直接调用私有方法(错误示范) 二.使用反射实例化类强制调用私有方法 2.1.使用类加载器加载被调 ...

  8. Java无所不能的反射在Android中需要熟练的知识

    什么是反射? 反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性 简而言之,通过反射,我们可以在运行时获得程序或程序 ...

  9. [LinqPad妙用]-在Net MVC中反射调用LinqPad中的Dump函数

    LinqPad有个非常强大的Dump函数.这篇讲解一下如何将Dump函数应用在.Net MVC Web开发中. 先看效果: 一.用.Net Reflector反编译LinqPad.exe,找出Dump ...

最新文章

  1. Makefile中关于shell 语句使用的注意事项
  2. 隐藏层节点数对迭代次数分布规律的影响
  3. 消息中间件--RabbitMQ --- 消费端限流 -- 非常重要
  4. 数字人民币App正式上线 京东子钱包推送量峰值增长超过20倍
  5. python切换虚拟环境和全局_为什么python虚拟环境启动后依然使用全局的python和pip...
  6. mac ---- 安装nginx
  7. 南理工OJ-1098 - 字符串问题
  8. Java 中 Comparable 和 Comparator 比较(转)
  9. 好看实用的六个html登录页面
  10. MIT 18.02 多变量微积分笔记总目录
  11. 星河互联刘玮玮:Echo卖疯了,为什么擅长制造爆款的中国人又没跟上?
  12. 泛泰 A870 TWRP Recovery En英/Cn简/Tw繁
  13. 2020CCPC 威海 G Caesar Cipher
  14. excel使用教程_Excel筛选和高级筛选怎么使用?筛选最全教程
  15. 百度编辑器上传图片后转到七牛存储
  16. 零基础-微信小程序入门教程
  17. SDHC ADMA和SDMA区别
  18. win10启用远程服务器访问,win10 如何打开远程服务_win10如何打开远程连接服务
  19. 健康比什么都重要-网易CEO孙德棣先生辞世
  20. 简单对应分析案例《好评数据分析》

热门文章

  1. Maven配置阿里镜像仓库
  2. ElementUI数据联动计算并实现数据校验
  3. 为鸿蒙说两句公道话,鸿蒙是安卓的套壳吗?
  4. centos 对已有卷扩容_CentOS LVM 新加硬盘,扩容逻辑卷步骤
  5. 咕咚技术总监唐平麟:神策使我们的数据平台成本降低约 75%,迭代效率提升 2~3 倍...
  6. Disjoint Set
  7. MySQL数据库的sql语句的导出与导入
  8. Ioc的推荐实现方式
  9. easyui required 提交验证
  10. Spread for Windows Forms快速入门(2)---设置Spread表单