C#反射在ADO中的巧用
在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中的巧用相关推荐
- 【Android 逆向】加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程
文章目录 一.加壳的 Android 应用启动流程 二.使用反射替换 LoadedApk 中的类加载器流程 一.加壳的 Android 应用启动流程 加壳的 Android 应用启动流程 : 加壳的 ...
- 物理光学4 反射与折射中的一些特殊现象
物理光学4 反射与折射中的一些特殊现象 第一种情况:n1<n2n_1<n_2n1<n2 也就是入射端的折射率小于折射端的折射率(也就是从光疏介质到光密介质,可以类比从空气中传播到 ...
- Java中的反射和Java中的访问修饰符
什么是反射? ①在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性 ②对于任何一个对象,我们都能够对它的方法和属性进行调用 总而言之:它反射Java语言中的一种机制,通过这种机制可以动 ...
- php 反射类,PHP中的反射类
这篇文章介绍的内容是关于PHP中的反射类 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 PHP的反射类ReflectionClass.ReflectionMethod使用实例 作者: ...
- 反射在java中的应用_java反射机制在项目中的运用
定义:Reflection是java开发语言特性之一,它允许运行中的java程序对自身进行检测,自审,并能操作程序内部的属性和方法,Reflection是java被视为动态语言关键之一.允许程序从执行 ...
- java为何重复调用方法_通过反射调用Java中的getter:重复调用它的最快方法是什么(在性能和可伸缩性方面)?...
小编典典 您可以使用MethodHandle.其Javadoc写道: 使用Lookup API中的工厂方法,可以将Core Reflection API对象表示的任何类成员转换为行为等效的方法句柄.例 ...
- Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?
文章目录 前言 一.私有方法在本类中直接调用 1.1.在本类中实例化,调用私有方法 1.2.尝试在其他类直接调用私有方法(错误示范) 二.使用反射实例化类强制调用私有方法 2.1.使用类加载器加载被调 ...
- Java无所不能的反射在Android中需要熟练的知识
什么是反射? 反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性 简而言之,通过反射,我们可以在运行时获得程序或程序 ...
- [LinqPad妙用]-在Net MVC中反射调用LinqPad中的Dump函数
LinqPad有个非常强大的Dump函数.这篇讲解一下如何将Dump函数应用在.Net MVC Web开发中. 先看效果: 一.用.Net Reflector反编译LinqPad.exe,找出Dump ...
最新文章
- Makefile中关于shell 语句使用的注意事项
- 隐藏层节点数对迭代次数分布规律的影响
- 消息中间件--RabbitMQ --- 消费端限流 -- 非常重要
- 数字人民币App正式上线 京东子钱包推送量峰值增长超过20倍
- python切换虚拟环境和全局_为什么python虚拟环境启动后依然使用全局的python和pip...
- mac ---- 安装nginx
- 南理工OJ-1098 - 字符串问题
- Java 中 Comparable 和 Comparator 比较(转)
- 好看实用的六个html登录页面
- MIT 18.02 多变量微积分笔记总目录
- 星河互联刘玮玮:Echo卖疯了,为什么擅长制造爆款的中国人又没跟上?
- 泛泰 A870 TWRP Recovery En英/Cn简/Tw繁
- 2020CCPC 威海 G Caesar Cipher
- excel使用教程_Excel筛选和高级筛选怎么使用?筛选最全教程
- 百度编辑器上传图片后转到七牛存储
- 零基础-微信小程序入门教程
- SDHC ADMA和SDMA区别
- win10启用远程服务器访问,win10 如何打开远程服务_win10如何打开远程连接服务
- 健康比什么都重要-网易CEO孙德棣先生辞世
- 简单对应分析案例《好评数据分析》