2009-08-10 41 views
2

我正在構建一個C#表達式樹來評估簡單表達式。表達式字符串被解析爲樹,並且尊重基本的操作符(數學的,邏輯的和關係的),並且通過使用偏差來優先考慮。C#表達式樹 - 動態值查找

除了bool,string和integer類型之外 - 我需要在運行時對錶達式的一些元素進行評估。這些是通過模板串表示,例如:

([firstname] == "bob") && ([surname] == "builder") 

以上表達式將用於提供用於當前表達式調用的上下文中,例如,在一個循環的對象的(潛在大)數來評價。模板部分將在當前上下文中反射使用 - 例如,在示例中將解析當前用戶的名字和姓氏,並在表達式解析中使用這些值而不是模板化字符串。

一個解決方案是在解析時解析模板值,這樣可以使用常量表達式類型,並且值的類型將是已知的。但是,重新構建和重新編譯表達式樹每個都會對性能造成影響。

所以,我需要一個表達式類型,其: - 值類型是不是在分析時已知的, - 這是一個方法調用在調用時解析

E.g. Desired example of usage in pseudo code 
ExpressionParser parser = new ExpressionParser(); // parses and builds expression trees 
MyParsedExpression expression = parser.Parse("([firstname] == 'bob') && ([surname] == 'builder'"); // wrapper for the parsed expression 
foreach (Object user in users) 
{ 
    expression.Context = user; 
    Boolean result = expression.EvaluateTruth(); 
    if (result == true) 
    { 
     // do something 
    } 
} 

感謝, fturtle

回答

2

使用​​表示傳入參數。至於類型異常......當您構建表達式樹時,您是否知道數據的類型?如果沒有,那會讓事情變得更加困難......

如果它對您有任何用處,我最近回答了一個similar question,附帶一些源代碼。它可能不是立即可用,但它應該是一個好的開始。

編輯:我不確定表達樹會在這裏非常有用。特別是PropertyExpression包含相關的PropertyInfo,所以它需要知道它正在使用的類型。如果類型可能爲每個值更改,則必須爲每個值重建表達式樹...

+0

爲響應而歡呼。我不確定參數表達式能夠幫助我,因爲表達式可以嵌套,並且可以包含任意數量的模板值。此外,構建表達式樹時不知道類型。總之,我想我是在某種委託表達之後。 – fturtle 2009-08-10 14:01:27

+0

恐怕不是很清楚你想要做什麼,什麼時候知道什麼信息。你有沒有解析事物的一面? *你有什麼信息?你有什麼信息?你能否存儲一些中間形式,讓你稍後建立一個強類型的表達式樹? – 2009-08-10 14:19:41