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 语法。

4

1 回答 1

3

不是直接的。动态 LINQ 库归结为表达式树,而表达式树不直接支持动态。最有可能的是,动态查询库Expression.PropertyOrField用于处理.Foo等,这不适用于dynamic.

如果发现参数是字典,您也许可以编写一个自定义表达式解析器,用大量查找代码替换它;不过不好玩。

于 2012-10-29T10:34:01.247 回答