承接着上一篇, 这一篇主要以堆栈的方式来演示一下, 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. Java多线程21:多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask

    CyclicBarrier 接着讲多线程下的其他组件,第一个要讲的就是CyclicBarrier.CyclicBarrier从字面理解是指循环屏障,它可以协同多个线程,让多个线程在这个屏障前等待,直到 ...

  2. Angular Input格式化

    今天在Angular中文群有位同学问到:如何实现对input box的格式化.如下的方式对吗? <input type="text" ng-model="demo. ...

  3. Unity3D shader简介

    Unity3D shader简介 可以肯定的说Unity3D使得很多开发者开发游戏更容易.毫无疑问,shader(着色器)编码,仍有很长的路要走.shader是一个专门运行在GPU的程序,经常被神秘包 ...

  4. DBCC DROPCLEANBUFFERS失效了?

    原文出处:http://www.sqlskills.com/blogs/paul/when-dbcc-dropcleanbuffers-doesnt-work/ DBCC DROPCLEANBUFFE ...

  5. 我所理解的OOP——UML六种关系

    最近由于经常给公司的小伙伴儿们讲一些OOP的基本东西,每次草纸都被我弄的很尴尬,画来画去自己都乱了,有时候也会尝试使用UML表示类之间的关系,但UML从毕业后就再也没接触过了,经常会被小伙伴儿们指出继 ...

  6. 如何将GridViewEX升级到UWP(Universal Windows Platform)平台

    引言 上一篇文章中,我们主要讲解了如何在保证GridView控件的用户体验基础上,扩展GridView生成GridViewEx控件,增加动态添加新分组功能等,本文在上文的基础上,介绍如何在Window ...

  7. webservice2

    按照 当然,里面没写清楚如何配置第三方jar 结果一访问就报错:org.codehaus.xfire.transport.http.XFireConfigurableServlet 4年前就搞过ws的 ...

  8. 启发式算法(Heuristic Algorithm)

    背景: 李航的<统计学习方法>一书中提到:决策树算法通常采用启发式算法,故了解之 问题解答: 时间有限,这里也只是将算法和启发式算法的区别和简单发展摘录如下: 一.算法和启发式方法之间的差 ...

  9. EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~再续~添加对各只读服务器的心跳检测

    回到目录 上一讲中基本实现了对数据库的读写分离,而在选择只读数据库上只是随机选择,并没有去检测数据库服务器是否有效,如服务器挂了,SQL服务停了,端口被封了等等,而本讲主要对以上功能进行一个实现,并对 ...

  10. [Java面试十]浏览器跨域问题.

    此块内容参考Ajax文档部分. 主要复习内容:     1.JavaScript核心对象     2.浏览器BOM对象     3.文档对象模型DOM     4.常见事件     5.Ajax编程( ...