我有一个动态创建的对象(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。
我觉得我现在正处于一条死胡同里......我的表情很好,物品被正确过滤掉......但是我不能说对象本身是否通过或不通过,因为我正在检查一个集合。
或者是否有另一种方法可以通过表达式确定对象属性的有效性?
我希望你理解我的问题: - )