2009-06-11 82 views

回答

0

我不相信你可以擴展Expression,但我想你可以添加一些擴展方法來創建表達式樹來簡化生成。

例如,也許你總是喜歡比較2個字符串,所以你可以添加一個擴展方法來返回樹來進行比較。你也可以添加一個表達式,在你的代碼的其他地方調用一個函數,這樣你就只能爲那些絕對必須以這種方式開發的東西寫表達式樹。

1

這正是codeplex上的DLR代碼所要做的;最後,他們重新創建了整個代碼庫in a different namespace(IIRC),直到4.0出貨。

這不一定能很好地與C#編譯器配合使用;我真的沒有嘗試過。

+0

感謝馬克。我是否認爲在C#4.0發佈時,DLR代碼將取代Linq表達式作爲選擇的表達庫? – MalcomTucker 2009-06-11 14:56:42

2

對於.net 3.5,您不能這樣做,因爲Expression構造函數需要一個ExpressionType枚舉值,並且不能向枚舉中添加新的節點類型。

你不能重載現有的節點類型,因爲你不能從任何「葉類」(比如BinaryExpression)繼承,因爲它們都是封閉的。

根據MSDN文檔,只要您重寫「Reduce」方法並使用節點類型ExpressionType.Extension,它看起來像您可以在CLR v4中執行此操作。

0

我也沒有嘗試過這個,但我同意斯科特的說法,這應該在4.0中工作。

具體來說,Expression Tree Spec on CodePlex說,這對NodeType屬性:

不在 在公共節點集合在.NET 表達推導應該返回節點種類擴展

相關問題