Emit學習(4) - Dapper解析之數據對象映射(二)

来源:http://www.cnblogs.com/elvinle/archive/2016/11/09/6047557.html
-Advertisement-
Play Games

承接著上一篇, 這一篇主要以堆棧的方式來演示一下, db數據轉換到類中去的一個過程. 先看第一張圖 程式在運行到176行(上一篇貼出的代碼)的時候, 就會出現上圖中的第一個棧. 那在此之前, Dapper又做了些什麼呢? 拋開Dapper的這種OpCodes的實現方式來說, 我們自己用代碼去轉換, ...


承接著上一篇, 這一篇主要以堆棧的方式來演示一下, 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里來, 其實他做的工作也是這樣子的, 順序可能稍有不同, 1,2的順序是可調的. 只是他實現的方式稍有不同而已. 條條大路通羅馬, 目的地都是相同的, 不同的是途中的風景.

二、接著第二張圖

上圖中的第一個棧, 是執行完 181行 代碼之後, 出現的情況, 180行, 181代碼的意思, 其實就是把 reader[index]複製一份到 loc2中, 這個loc2就是前面(161行)申明的, 類型為object的本地變數, 所以, 從堆棧的情況來看, 180行未執行前, 和181行執行完之後的堆棧是一樣的. 所以我就不畫了. 

在執行Unbox_Any之前, 是已經知道source type和target type了, 並且已經經過判斷, 是否能夠轉換, 然後再通過Unbox_Any來轉, 其實Unbox是拆箱操作, 如果source,target都是Int類型, 這裡也是不會報錯的

上面這兩幅圖就是正常情況下(int, string, datetime, double等)的堆棧變化過程了, 應該還是比較能輔助理解的了.

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 介紹 KEY分區和HASH分區相似,但是KEY分區支持除text和BLOB之外的所有數據類型的分區,而HASH分區只支持數字分區,KEY分區不允許使用用戶自定義的表達式進行分區,KEY分區使用系統提供的HASH函數進行分區。當表中存在主鍵或者唯一鍵時,如果創建key分區時沒有指定欄位系統預設會首選主 ...
  • Mysql監控屬於DB監控的模塊之一,包括採集、展示、監控告警。本文主要介紹Mysql監控的主要指標和採集方法。 Mysql監控和Redis監控的邏輯類似,可參考文章《Redis監控》。 DBA前臺添加Mysql監控時系統會調用自動調度平臺介面將Mysql監控的加密賬戶密碼和ip埠等信息發送至目標 ...
  • 基本上分三步走 1,添加fcitx的鍵盤輸入法系統,因為sogou是基於fcitx的,而系統預設的是iBus; 2,安裝sogou輸入法; 3,設置系統參數及一些註意點。 第一步、添加fcitx鍵盤輸入法系統 ①先添加以下源 sudo add-apt-repository ppa:fcitx-tea ...
  • http://www.jxedt.com/wen/bukao/3174956875936366607.htmlhttp://www.jxedt.com/wen/bukao/3174956867599728675.htmlhttp://www.jxedt.com/wen/bukao/317495687 ...
  • ln是linux中又一個非常重要命令,它的功能是為某一個文件在另外一個位置建立一個同步的鏈接,分為軟鏈接、硬鏈接。軟鏈接相當於windows的快捷方式,下麵是使用方法和示例 ln是linux中又一個非常重要命令,它的功能是為某一個文件在另外一個位置建立一個同步的鏈接.當我們需要在不同的目錄,用到相同 ...
  • DOS下windows系統查看wifi密碼 首先,按win+R鍵,win鍵如下 彈出框中輸入cmd 在彈出界面輸入 netsh wlan show profiles 你可以看到你鏈接過的所有wifi名稱(我只鏈接了一個wifi) 選擇你要查看的wifi密碼,輸入netsh wlan show pro ...
  • 公司的redis業務很多,redis監控自然也是DB監控的一大模塊,包括採集、展示、監控告警。本文主要介紹redis監控的主要指標和採集方法。 一、Redis監控系統邏輯 1、DBA通過前臺頁面添加redis監控,填寫ip和埠,配置閾值、負責人等信息 2、前臺調用自動調度平臺介面將redis監控採 ...
  • 建議設置網卡NAT模式 動態網路配置:1、一定要開啟本地DHCP服務 2、在虛擬網路編輯器中選擇NAT模式選中DHCP項如下圖 3、ifup eth0 靜態網路配置 : 註釋:ifcfg-eth0部分參數說明 DEVICE=eth0#描述網卡對應的設備別名 HWADDR=00:0C:29:42:DD ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...