Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ExpandooObject的动态LINQ查询?_C#_Linq_Dynamic - Fatal编程技术网

C# ExpandooObject的动态LINQ查询?

C# ExpandooObject的动态LINQ查询?,c#,linq,dynamic,C#,Linq,Dynamic,是否有任何方法可以使用LINQ动态查询库(System.LINQ.dynamic)根据ExpandooObject的属性评估条件?以下代码在“var e..”行引发异常,表示“ExpandoObject类型中不存在属性或字段“Weight”:- 另一种方法是将“statebag”实现为字典,但这将导致更详细的条件字符串,例如MyStateBag[“Foo”]>=50&&MyStateBag[“Bar”]>=100。由于这将用作用户脚本环境的基础,如果可能的话,我更喜欢使用更简单的Expandoo

是否有任何方法可以使用LINQ动态查询库(System.LINQ.dynamic)根据ExpandooObject的属性评估条件?以下代码在“
var e..
”行引发异常,表示“ExpandoObject类型中不存在属性或字段“Weight”:-


另一种方法是将“statebag”实现为字典,但这将导致更详细的条件字符串,例如
MyStateBag[“Foo”]>=50&&MyStateBag[“Bar”]>=100
。由于这将用作用户脚本环境的基础,如果可能的话,我更喜欢使用更简单的ExpandooObject语法。

而不是直接使用。动态LINQ库可以归结为一个表达式树,而表达式树并不直接支持动态LINQ。最可能的情况是,动态查询库正在使用
Expression.PropertyOrField
来处理
.Foo
等,而这将不适用于
dynamic


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

这正是我所怀疑的,谢谢你。我可能会把NCalc作为另一种选择。。。
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);