LINQ Expression tree分析
本文向大家介紹LINQ Expression tree,可能好多人還不了解LINQ Expression tree,沒有關(guān)系,看完本文你肯定有不少收獲,希望本文能教會你更多東西。
LINQ Expression tree
一棵LINQ Expession tree在創(chuàng)建后就不可再改變。假如某個程序接收一棵Expression tree為參數(shù),然后僅僅是用于生成別的形式的代碼(例如SQL語句),那么這個不可改變性不會有什么影響。但如果一個程序想對一棵Expression tree進(jìn)行修改該怎么辦呢?解決方法是從來源的Expression tree復(fù)制出一棵新的樹,在復(fù)制過程中根據(jù)自己的需要選擇是直接復(fù)制原有節(jié)點(diǎn)還是創(chuàng)建修改了的節(jié)點(diǎn)。MSDN上有一個例子解釋了如何實(shí)現(xiàn)這種需求,如何:修改表達(dá)式目錄樹。
更詳細(xì)的LINQ Expression tree的討論留待以后再說。先看代碼:
- digraph ExpressionTree {
- node [fontsize=12, fontcolor=blue, font=Courier, shape=box]
- // node declarations
- lambda [label="Lambda Expression"]
- anoFuncSig [label="Anonymous Function\nSignature"]
- arrow [label="=>"]
- anoFuncBody [label="Anonymous Function\nBody"]
- impFuncSig [label="Implicit Anonymous\nFunction Signature"]
- expr [label="Expression"]
- impParam [label="Implicit Anonymous\nFunction Parameter"]
- uexpr1 [label="Unary Expression"]
- neg [label="-"]
- uexpr2 [label="Unary Expression"]
- id [label="Identifier:\nx"]
- simpName [label="Simple Name:\nx"]
- // relations
- lambda -> anoFuncSig
- lambda -> arrow
- lambda -> anoFuncBody
- {rank=same; anoFuncSig arrow anoFuncBody }
- anoFuncSig -> impFuncSig
- anoFuncBody -> expr
- {rank=same; impFuncSig expr }
- impFuncSig -> impParam
- expr -> uexpr1 [style=dashed]
- {rank=same; impParam uexpr1 }
- impParam -> id
- uexpr1 -> neg
- uexpr1 -> uexpr2
- {rank=same; id neg uexpr2 }
- uexpr2 -> simpName
- }
ast.dot:
- digraph ExpressionTree {
- node [fontsize=12, fontcolor=blue, font=Courier, shape=box]
- edge [fontsize=10, fontcolor=purple]
- // node declarations
- lambda [label="Lambda Expression"]
- param [label="Parameter:\nx"]
- body [label="Unary Expression\n(Negation)"]
- param2 [label="Simple Name:\nx"]
- // relations
- lambda -> param [label="Signature"]
- lambda -> body [label="Body"]
- {rank=same; param body }
- body -> param2
- param -> param2 [label="(same node)", fontsize=8, style=dashed, dir=both]
- }
【編輯推薦】