天天看點

表達式樹之建構Lambda表達式

表達式樹是一種樹形資料結構,通過動态語言運作時 (DLR) 将一組動态語言服務添加到公共語言運作時 (CLR),為靜态類型語言添加動态特征。C#屬于靜态語言.簡而言之,就是通過CLR引入DLR,DLR中包含了表達式樹的功能,那麼C#代碼就具備了将靜态代碼轉換成動态代碼的功能.常用于一些運算邏輯的轉換.将運算邏輯轉換成資料結構緩存到記憶體中.比如通過表達式樹緩存通過反射建構對象的過程,減少每次調用反射的性能消耗.具體參考DLR官方文檔.

1、場景

假設有一個商品促銷系統,促銷系統的大緻原理是維護商品的價格,商品價格會在一系列的促銷規則加持下産生變動,大緻的寫死如下:

如上代碼能很好的完成需求,但是每個商品的促銷活動都大不相同,且商品很多,是以客戶提出這個促銷活動的具體的扣價規則可以配置.顯然上面的代碼不滿足需求.是以我們需要通過某種方式去存儲計算規則.并且可以讓客戶自行配置.有一種方式是維護一張規則表,存儲運算符号,然後通過如下方式:

通過将計算規則存入資料庫.然後調用DataTable的Api實作計算.但是這種方式顯然不夠靈活,且如果複雜的計算流程,配置起來會比較麻煩且容易出錯.下面來看看表達式樹怎麼做:

表達式樹之建構Lambda表達式

 通過這種方式雖然能完成需求,但是這種方式任然需要通過寫死的方式,顯然不可取,且此時的表達式樹雖然存儲了所有的運算規則,但是這個規則隻能是簡單的數學運算,如果包含了負責的運算,則需要方法體,那麼是不被允許的,如下圖:

表達式樹之建構Lambda表達式

 是以這種方式,需要将所有的運算邏輯全部轉換成表達式樹的形式即每一個節點都轉換成表達式樹,才可以,代碼如下:

繼續閱讀