讓我們先來看下expression 表示式如何將datareader轉換成object:
idatareader reader = null在new user的時候採用物件初始化方式給屬性賦值,而在實際專案中我們會遇到更複雜的,比如還要判斷是否為dbnull,要不然轉換會出錯,在這裡我定義乙個getvalue(int i)方法,專門做取值操作。; expression
> expr = (r) => new
user()
;var func =expr.compile();
func(reader);
class現在將**修改下,dbfieldreader
public t getvalue(int
index)
}
idatareader reader = null是不是簡潔了很多?把判斷**轉移到dbfieldreader類中處理,現在我們要將這個方法做成通用實體類轉換,先分解下expression表示式(如吐有錯誤,懇請大神指教)。; dbfieldreader fr = new
dbfieldreader(reader);
expression
> expr = (r) => new
user()
;var func =expr.compile();
func(fr);
第一步定義引數,型別為dbfieldreader,引數名:r
parameterexpression parexpr = expression.parameter(typeof(dbfieldreader), "第二步,呼叫user類的建構函式,**如下:r");
var newexpr = expression.new(type.getconstructors().first());合併這2個表示式和執行結果:
基本的雛形出來了,現在要做的就是給屬性賦值,怎麼來呢?先來個簡單的,就是給固定值。
var userid = expression.bind(type.getproperty("這就相當於userid = 1的賦值操作,繼續合併表示式:userid
"), expression.constant(1, typeof(int)));
常量賦值沒問題後,下面就要來呼叫方法了。
var method = typeof(dbfieldreader).getmethods().where(c => c.name == "這句話相當於 r.getvalue(0);getvalue
" &&c.isgenericmethod).first();
var callexpr = expression.call(parexpr, method.makegenericmethod(typeof(int)), expression.constant(0));
var userid = expression.bind(type.getproperty("userid"), callexpr);
先獲取getvalue方法,然後呼叫makegenericmethod生成泛型方法,expression.constant(0)就是引數值。
完整版**:
idatareader reader = null當然我們還需要修改sql語句,不能用select * 語法,而是要用select userid,email...from這樣的語法; dbfieldreader fr = new
dbfieldreader(reader);
parameterexpression parexpr = expression.parameter(typeof(dbfieldreader), "r"
);
var method = typeof(dbfieldreader).getmethods().where(c => c.name == "
getvalue
" &&c.isgenericmethod).first();
list
memberbindings = new list();
int index = 0
;
foreach (var item in
var init =expression.memberinit(newexpr, memberbindings);
expression
> expr = (expression>)expression.lambda(init, parexpr);
一步步實現自己的ORM(一)
最近在研究orm,嘗試著自己開發了乙個簡單的orm。我個人不喜歡ef因為跟不上ef公升級太快了,再說公司裡還停留在c 3.5時代,對於nhibernate配置太複雜看到就頭暈,就心生自己做乙個orm的念頭,現在把開發過程中的點點滴滴記錄下來,供自己和新手參考,大神請直接忽略這篇文章。create t...
一步步實施 DevOps (五)
一步步實施 devops 一 一步步實施 devops 二 一步步實施 devops 三 一步步實施 devops 四 自動化部署 本章節重點談自動化部署,每個人對自動化部署都有自己的理解,每個企業對自動化部署的需求也不同。目前很多雲平台開始推出一些列 devops 工具,體驗了一下,仍然處在初級階...
自己怎麼一步步喜歡程式設計
在夜深人靜的時候我整理一下思緒 自己當年是如何從愛玩遊戲的小孩子一步步成長為一名熱愛程式設計的程式設計師。1 玩電腦 要程式設計就要觸到電腦,我喜歡電腦原因很簡單,我喜歡玩遊戲。一開始家裡沒電腦就跑去親戚家玩。人們都說玩遊戲是學電腦最慢 最傻的辦法。但是我必須要再新增一句 也是最有效的辦法。乙個事物...