在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. Javascript中构造函数与new命令

    典型的面向对象编程语言(比如C++和Java),存在“类”(class)这个概念.所谓“类”就是对象的模板,对象就是“类”的实例.但是,在JavaScript语言的对象体系,不是基于“类”的,而是基于 ...

  2. 公司内部的一篇关于dom方法的分享

    第一部分 dom node类型 nodeType 属性 nodeType 属性返回节点的类型.nodeType 是只读的. 比较重要的节点类型有: 元素类型 NodeType 元素 1 属性 2 文本 ...

  3. IOS开发基础知识--碎片9

    1:两种方法删除NSUserDefaults所有记录 //方法一 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; [[N ...

  4. Fragment配合RadioGroup实现点击切换布局

    这里用了 compile 'com.jakewharton:butterknife:7.0.1' compile 'org.greenrobot:eventbus:3.0.0' MainActivit ...

  5. iOS开发之功能模块--用runtime给UIView类别拓展PressMenu工具

    这是个很有用的列别工具类,在聊天对话框添加和QQ一样的"复制.粘贴.取消"等选项,而且使用起来很方便,只要找到聊天泡泡内部的某个View,比如Label或者背景冒泡的UIImage ...

  6. vim插件管理vundle备忘

    转自:http://blog.csdn.net/jiaolongdy/article/details/17889787/ http://www.cnblogs.com/xia520pi/archive ...

  7. 初探ansible安装

    一.ansible介绍常用的自动化运维工具 Puppet —基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱SaltStack —基于 Python 开发,采用 ...

  8. 【hive】——metastore的三种模式

    Hive中metastore(元数据存储)的三种方式: 内嵌Derby方式 Local方式 Remote方式 [一].内嵌Derby方式 这个是Hive默认的启动模式,一般用于单元测试,这种存储方式有 ...

  9. BCP笔记整理(二)

    BCP的基础用法可以参考上一篇:http://www.cnblogs.com/Gin-23333/p/5489889.html 这篇是补充一些有可能会用到,但是出场几率并不算大的几个参数 1.首先是 ...

  10. shell中各种括号的作用()、(())、[]、[[]]、{}

    一.小括号,圆括号() 1.单小括号 ()    ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有 ...