承接着上一篇, 这一篇主要以堆栈的方式来演示一下, db数据转换到类中去的一个过程.

一、先看第一张图

程序在运行到176行(上一篇贴出的代码)的时候, 就会出现上图中的第一个栈.

那在此之前, Dapper又做了些什么呢? 抛开Dapper的这种OpCodes的实现方式来说, 我们自己用代码去转换, 实现思路如下:

1. 首先肯定是要获取, 从db读取出来的那么多列中, 有哪一些是需要转换的吧, 如果是select * , 那会读取出所有的列, 但是我本身并不需要那么多列, 而且, 我接收的类, 本身可能并没有那么多的列, 所以, 首先确定有哪些列需要转换, 以及这些列从db中读取出来是什么类型的.

2. 当确定好有效的列之后, 就可以获取类中的构造函数, 已备创建类的时候使用. 在获取构造函数的时候, 当然是越简单的构造函数越好.(Dapper中会优先检测标有ExplicitConstructor属性的构造函数, 然后获取构造函数的参数, 然后初始化参数), 然后就是把这个类new出来.

3. 到现在, 我们其实就已经能知道source data type 和 target property/feild type了, 既然已经两边的类型都已经知道, db数据已经准备好, target class也已经new好了, 就可以来实现转换了, 根据类型的不同, 来使用不同的转换. 值得一提的事, 如果 target class中, 含有自定义类的属性或者字段, Dapper是不会继续转换的, 直接给了个null就了事了. 其实Dapper中, 也是可以实现此功能的, 这部分以后再说.

那么现在回到Dapper里来, 其实他做的工作也是这样子的, 顺序可能稍有不同, 1,2的顺序是可调的. 只是他实现的方式稍有不同而已. 条条大路通罗马, 目的地都是相同的, 不同的是途中的风景.

二、接着第二张图

上图中的第一个栈, 是执行完 181行 代码之后, 出现的情况, 180行, 181代码的意思, 其实就是把 reader[index]复制一份到 loc2中, 这个loc2就是前面(161行)声明的, 类型为object的本地变量, 所以, 从堆栈的情况来看, 180行未执行前, 和181行执行完之后的堆栈是一样的. 所以我就不画了.

在执行Unbox_Any之前, 是已经知道source type和target type了, 并且已经经过判断, 是否能够转换, 然后再通过Unbox_Any来转, Unbox是拆箱操作, Unbox_Any是拆箱成你需要的类型

上面这两幅图就是正常情况下(int, string, datetime, double等)的堆栈变化过程了, 应该还是比较能辅助理解的了.

Emit学习(4) - Dapper解析之数据对象映射(二)的更多相关文章

  1. Emit学习(4) - Dapper解析之数据对象映射(一)

    感觉好久没有写博客了, 这几天有点小忙, 接下来会更忙, 索性就先写一篇吧. 后面估计会有更长的一段时间不会更新博客了. 废话不多说, 先上菜. 一.示例 1. 先建类, 类的名称与读取的表名并没有什 ...

  2. php设计模式 数据对象映射模式

    数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作. 在代码中实现数据对象映射模式,实现一个ORM类,将复杂的sql语句映射成对象属性的操作.对象关系映射(Obje ...

  3. PHP 设计模式 笔记与总结(10)数据对象映射模式 2

    [例2]数据对象映射模式结合[工厂模式]和[注册模式]的使用. 入口文件 index.php: <?php define('BASEDIR',__DIR__); //定义根目录常量 includ ...

  4. PHP 设计模式 笔记与总结(9)数据对象映射模式

    [数据对象映射模式] 是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作.例如在代码中 new 一个对象,使用数据对象映射模式就可以将对象的一些操作比如设置一些属性,就会自动保存到数 ...

  5. PHP设计模式笔记六:数据对象映射模式 -- Rango韩老师 http://www.imooc.com/learn/236

    数据对象映射模式 1.数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作 2.在代码中实现数据对象映射模式,我们将实现一个ORM类,将复杂的SQL语句映射成对象属性 ...

  6. Java创建和解析Json数据方法(二)——org.json包的使用

    (二)org.json包的使用 1.简介   工具包org.json.jar,是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookie ...

  7. ASP.NET MVC 模型和数据对象映射实践

    在使用 MVC 开发项目的过程中遇到了个问题,就是模型和数据实体之间的如何快捷的转换?是不是可以像 Entity Framework 的那样 EntityTypeConfiguration,或者只需要 ...

  8. .NetCore学习笔记:四、AutoMapper对象映射

    什么是AutoMapper?AutoMapper是一个简单的小型库,用于解决一个看似复杂的问题 - 摆脱将一个对象映射到另一个对象的代码.这种类型的代码是相当沉闷和无聊的写,所以为什么不发明一个工具来 ...

  9. Python学习笔记_Chapter 6定制数据对象

    1. 有用的BIF a. 判断字符串中是否包含子字符串 if s_a in s_b: b. pop() 描述:从指定的列表位置删除并返回一个数据项. (sarah_name,sarah_dob)=l_ ...

随机推荐

  1. Expression Tree 扩展MVC中的 HtmlHelper 和 UrlHelper

    表达式树是LINQ To everything 的基础,同时各种类库的Fluent API也 大量使用了Expression Tree.还记得我在不懂expression tree时,各种眼花缭乱的A ...

  2. Netbeans+CodeIgniter搭建PHP开发环境

    为什么选这样的开发环境 常见的PHP集成开发环境有Eclipse+PDT,NetBeans,PHPEclipse,Zend Studio,PhpStorm等,我经过多方面的考虑(费用.易用性.功能.活 ...

  3. 浅谈Excel开发:一 Excel 开发概述

        做Office相关的开发工作快一年多了,在这一年多里,在插件的开发中遇到了各种各样的问题和困难,还好同事们都很厉害,在和他们的交流讨论中学到了很多的知识.目前Office相关的开发资料是比较少 ...

  4. node访问iis使用keep-alive设置不当

    iis默认的连接超时时间为2分钟 ,因此node程序使用keep-alive访问时,keep-alive的时间不应该超过2分钟,否则在请求完成后,node端继续保持连接,2分钟后iis断开连接,会导致 ...

  5. [问题解决]安装 SQL Server 无法开启NetFx3.5 的错误

    谷歌了一下,该问题是由于系统中缺少.Net3.5相关特性造成的.需要手动安装一下3.5的环境 解决办法: Windows 徽标键+R打开运行窗口 输入Dism /online /enable-feat ...

  6. 与其他.Net异步模式和类型进行互操作

    返回该系列目录<基于Task的异步模式--全面介绍> Tasks和异步编程模型APM(Tasks and the Asynchronous Programming Model) 从APM到 ...

  7. C# 对包含文件或目录路径信息的 System.String 实例执行操作

    在字符串操作中有一类比较特殊的操作,就是对包含文件或目录路径信息的 System.String 实例执行操作.比如根据一个表示路径的字符串获取其代表的文件名称.文件夹路径.文件扩展名等.在很多时候,我 ...

  8. 第九回 Microsoft.Practices.Unity.Interception实现基于数据集的缓存(针对六,七,八讲的具体概念和配置的解说)

    返回目录 概念 Microsoft.Practices.Unity.Interception是一个拦截器,它隶属于Microsoft.Practices.Unity组成之中,主要完成AOP的功能,而实 ...

  9. 第十六回 IoC组件Unity续~批量动态为Unity添加类型和行为

    回到目录 之前的一篇Unity的文章主要是基本的实现,并没有什么特别的地方,使用Unity可以方便的实现应用程序的IoC控制反转,这给我们的应用程序在耦合度上变得高了,同时可测试性加强了,当然,这些的 ...

  10. fir.im Weekly - 深度揭秘 App 启动全过程

    世纪寒潮席卷全中国,可谓普天之下莫低0℃.无论怎样的严寒都抵挡不了程序员们的创造的激情... 本期的 fir.im Weekly ,最新的 iOS/Android 开发资源,GitHub 源码.前端技 ...