ExpandoObject的动态LINQ查询?

3
有没有办法使用LINQ动态查询库(System.Linq.Dynamic)根据ExpandoObject的属性评估条件?以下代码在“var e...”行抛出异常,说“ExpandoObject类型中不存在属性或字段'Weight'”:
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语法。

1个回答

3
并非直接支持。动态LINQ库归结为表达式树,而表达式树不直接支持动态技术。最有可能的是,动态查询库使用Expression.PropertyOrField处理.Foo等,而这将无法与dynamic一起工作。
如果发现参数是字典,则您可以编写自定义表达式解析器来将其替换为大量查找代码;但这并不好玩。

这正是我所怀疑的,无论如何还是谢谢。我可能会考虑NCalc作为替代方案... - Andrew Stephens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接