簡體   English   中英

如何在C#中創建自定義System.Linq.Expression類?

[英]How to create custom System.Linq.Expression classes in C#?

是否可以創建自定義Expression類? 如果是這樣,有沒有人有任何例子? 繼承自框架抽象Expression類帶來了一個問題,因為它的構造函數采用ExpressionType參數,這是一個框架枚舉類型 - 我顯然無法自定義它!

有任何想法嗎?

使用.net 3.5,您無法執行此操作,因為Expression構造函數接受ExpressionType枚舉值,並且您無法向枚舉添加新節點類型。

您也不能重載現有節點類型,因為您無法從任何“葉類”(如BinaryExpression)繼承,因為它們都是密封的。

根據MSDN文檔,您可以在CLR v4中執行此操作,只要您覆蓋“Reduce”方法並使用節點類型ExpressionType.Extension。

這正是codeplex上的DLR代碼所必須做的; 最后,他們在不同的命名空間 (IIRC)中重新創建了整個代碼庫,直到4.0發布。

這不一定適合C#編譯器; 老實說,我沒有嘗試過。

我自己也沒有嘗試過,但我同意斯科特的說法,即這應該適用於4.0。

具體來說, CodePlex上表達式樹規范說明了NodeType屬性:

表達式的派生不在.NET的公共節點集中,應返回節點類型Extension

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

例如,您可能總是喜歡比較2個字符串,因此您可以添加一個擴展方法,該方法將返回樹進行比較。 您還可以添加一個在代碼中的其他位置調用函數的表達式,這樣您就只能為那些絕對必須以這種方式開發的東西編寫表達式樹。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM