通过动态表达式检查动态对象属性

时间:2015-04-07 09:40:19

标签: c# .net expression-trees

我有一个动态创建的对象(ExpandoObject)。我需要检查这个对象是否会被它的属性“绘制”。

检查是一个表达式,也将在运行时创建。 该表达式包含子句,不同的运算符,并与“AND”和“OR”结合使用。

有时,表达式会检查对象上不存在的属性。出于这个原因,我认为使用属性名称作为键的字典是个好主意。然后,表达式还将检查密钥是否存在。

样本1:PropertyX ==“a”|| PropertyY ==“b”

 {l => (IIF(l.ContainsKey("PropertyX"), l.Item["PropertyX"] == "a"), False) OR Invoke(l => IIF(l.ContainsKey("PropertyY"), l.Item["PropertyY"] == "b")), False), l))}

样本2:PropertyX ==“a”&& PropertyY ==“b”

 {l => (IIF(l.ContainsKey("PropertyX"), l.Item["PropertyX"] == "a"), False) AndAlso Invoke(l => IIF(l.ContainsKey("PropertyY"), l.Item["PropertyY"] == "b")), False), l))}

我想检查对象的有效性是这样的:

var o = new ExpandoObject();
o.Add("PropertyX", "a");
o.Add("PropertyY", "b");
....
var items = o as IDictionary<string, object>;
var result = items.AsQueryable().Where(whereExpression);

bool isMatch = result.Any();

问题: 如果表达式仅包含“OR”(样本1),则它可以正常工作并且result.Any()可用于判断是否绘制了对象。但是因为我在集合上应用了where表达式,带有“AND”(样本2)的表达式的结果将是一个空列表和result.Any总是返回false。

我觉得我现在正处于一条死胡同里......我的表情很好,物品被正确过滤掉......但是我不能说对象本身是否通过或不通过,因为我正在检查一个集合。

或者是否有另一种方法可以通过表达式确定对象属性的有效性?

我希望你理解我的问题: - )

0 个答案:

没有答案