2010-01-29 25 views
4

是否有可能實現! (不)使用表達式樹。我感興趣的是建立一個C#類的eval將分析和評估假含有真正的邏輯表達式,||,& &和!我知道& &和||目前由.NET 4的表達式樹的支持,但我想知道,如果他們是實現像summat辦法!(x & & Y)|| z其中z =假,y =真,z =假。落實不,.NET 4

目前我使用一個標準的基於堆棧的標記生成器,分析器,評估,以評估這些類型的表達式,但會happly傾倒,如果可以創建和動態執行一個合適的表達式樹。

+0

的標題說,.NET 4,但標籤說.NET 3.5。哪一個? – 2010-01-29 20:50:46

+0

3.5當我上次檢查時,它沒有實現,但它現在在文檔中,所以忽略.net條目。 – 2010-01-29 20:57:33

回答

9

我通常會發現,值得編寫一個lambda表達式,這個lambda表達式是我想要的,然後看看C#編譯器用它做了什麼。

所以這個代碼:

Expression<Func<bool,bool>> func = x => !x; 

被編譯成:

ParameterExpression expression2; 
Expression<Func<bool, bool>> expression = 
     Expression.Lambda<Func<bool, bool>>(Expression.Not(
      expression2 = Expression.Parameter(typeof(bool), "x")), 
       new ParameterExpression[] { expression2 }); 

(道歉格式 - 這是很難知道如何處理這樣做)

這與反編譯反射器,但它的「優化」設置在.NET 2.0中,以避免使用lambda語法。

一旦你已經過了垃圾,你會看到它使用Expression.Not。 & &使用Expression.AndAlso和||使用Expression.OrElse

+0

嗨喬恩, 像往常一樣,一個快速和極好的答案。 鮑勃。 – 2010-01-29 21:01:51

+0

真棒技術用於更好地理解引擎蓋下發生了什麼。 – 2010-01-29 21:03:05

+0

我原本有完整的'!(x && y)||但是它的代碼太麻煩了:) – 2010-01-29 21:08:43

2

這已經存在於System.Linq.Expressions。請參閱UnaryExpression。除非有你不喜歡的表情,否則我會建議使用它們。還有一些方法可以從源代碼創建抽象語法樹,特別是在Microsoft.Scripting.Ast(可在DLR:Microsoft.Scripting中找到)中。