是否有可能實現! (不)使用表達式樹。我感興趣的是建立一個C#類的eval將分析和評估假含有真正的邏輯表達式,||,& &和!我知道& &和||目前由.NET 4的表達式樹的支持,但我想知道,如果他們是實現像summat辦法!(x & & Y)|| z其中z =假,y =真,z =假。落實不,.NET 4
目前我使用一個標準的基於堆棧的標記生成器,分析器,評估,以評估這些類型的表達式,但會happly傾倒,如果可以創建和動態執行一個合適的表達式樹。
是否有可能實現! (不)使用表達式樹。我感興趣的是建立一個C#類的eval將分析和評估假含有真正的邏輯表達式,||,& &和!我知道& &和||目前由.NET 4的表達式樹的支持,但我想知道,如果他們是實現像summat辦法!(x & & Y)|| z其中z =假,y =真,z =假。落實不,.NET 4
目前我使用一個標準的基於堆棧的標記生成器,分析器,評估,以評估這些類型的表達式,但會happly傾倒,如果可以創建和動態執行一個合適的表達式樹。
我通常會發現,值得編寫一個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
。
嗨喬恩, 像往常一樣,一個快速和極好的答案。 鮑勃。 – 2010-01-29 21:01:51
真棒技術用於更好地理解引擎蓋下發生了什麼。 – 2010-01-29 21:03:05
我原本有完整的'!(x && y)||但是它的代碼太麻煩了:) – 2010-01-29 21:08:43
這已經存在於System.Linq.Expressions
。請參閱UnaryExpression。除非有你不喜歡的表情,否則我會建議使用它們。還有一些方法可以從源代碼創建抽象語法樹,特別是在Microsoft.Scripting.Ast
(可在DLR:Microsoft.Scripting中找到)中。
的標題說,.NET 4,但標籤說.NET 3.5。哪一個? – 2010-01-29 20:50:46
3.5當我上次檢查時,它沒有實現,但它現在在文檔中,所以忽略.net條目。 – 2010-01-29 20:57:33