是否可以創建自定義表達式類?如果是這樣,有沒有人有任何例子?從框架繼承抽象Expression類帶來了一個問題,因爲它的構造函數需要一個ExpressionType參數,這是一個框架枚舉類型 - 我顯然不能自定義這個!如何在C#中創建自定義的System.Linq.Expression類?
任何想法?
是否可以創建自定義表達式類?如果是這樣,有沒有人有任何例子?從框架繼承抽象Expression類帶來了一個問題,因爲它的構造函數需要一個ExpressionType參數,這是一個框架枚舉類型 - 我顯然不能自定義這個!如何在C#中創建自定義的System.Linq.Expression類?
任何想法?
我不相信你可以擴展Expression,但我想你可以添加一些擴展方法來創建表達式樹來簡化生成。
例如,也許你總是喜歡比較2個字符串,所以你可以添加一個擴展方法來返回樹來進行比較。你也可以添加一個表達式,在你的代碼的其他地方調用一個函數,這樣你就只能爲那些絕對必須以這種方式開發的東西寫表達式樹。
這正是codeplex上的DLR代碼所要做的;最後,他們重新創建了整個代碼庫in a different namespace(IIRC),直到4.0出貨。
這不一定能很好地與C#編譯器配合使用;我真的沒有嘗試過。
對於.net 3.5,您不能這樣做,因爲Expression構造函數需要一個ExpressionType枚舉值,並且不能向枚舉中添加新的節點類型。
你不能重載現有的節點類型,因爲你不能從任何「葉類」(比如BinaryExpression)繼承,因爲它們都是封閉的。
根據MSDN文檔,只要您重寫「Reduce」方法並使用節點類型ExpressionType.Extension,它看起來像您可以在CLR v4中執行此操作。
我也沒有嘗試過這個,但我同意斯科特的說法,這應該在4.0中工作。
具體來說,Expression Tree Spec on CodePlex說,這對NodeType屬性:
不在 在公共節點集合在.NET 表達推導應該返回節點種類擴展
感謝馬克。我是否認爲在C#4.0發佈時,DLR代碼將取代Linq表達式作爲選擇的表達庫? – MalcomTucker 2009-06-11 14:56:42