2012-10-29 62 views
3

有什麼辦法可以使用LINQ動態查詢庫(System.Linq.Dynamic)來評估一個基於ExpandoObject屬性的條件嗎?下面的代碼拋出的「var e...」行例外,他說「沒有屬性或字段‘重’型ExpandoObject存在」: -動態LINQ查詢ExpandoObject?

const string TestCondition = "MyStateBag.Foo >= 50 && MyStateBag.Bar >= 100"; 

dynamic myStateBag = new ExpandoObject(); 
myStateBag.Foo = 70; 
myStateBag.Bar = 100; 

var p = Expression.Parameter(typeof(ExpandoObject), "MyStateBag"); 
var e = DynamicExpression.ParseLambda(new[] { p }, null, TestCondition); 
var result = e.Compile().DynamicInvoke(myStateBag); 
Assert.IsTrue(result); 

另一種方法是實施「StateBag的」作爲一本字典,但是這會導致稍微更冗長的條件字符串,例如MyStateBag["Foo"] >= 50 && MyStateBag["Bar"] >= 100。由於這將被用作用戶腳本環境的基礎,如果可以實現,我寧願使用更簡單的ExpandoObject語法。

回答

3

不直接。動態LINQ庫歸結爲一個表達式樹,並且表達式樹不支持直接支持動態。最有可能的是,動態查詢庫使用Expression.PropertyOrField來處理.Foo等,而將不能工作dynamic

可能也許寫一個自定義表達式分析器,如果它發現參數是一個字典,用很多查找代碼替換它;雖然沒有趣味。

+0

這就是我所懷疑的,無論如何。我可能會考慮NCalc作爲替代方案... –