2012-10-29 64 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作为替代方案... –