使用C#中的ExpressionVisitor识别lambda表达式中的括号

时间:2014-07-18 19:21:27

标签: c# lambda expression expressionvisitor

我有一个库,它使用ExpressionVisitor类将lambda表达式转换为odata过滤器字符串。 例如,表达式o => o.Teste == null && !(o.Date != DateTime.Now)变为$filter=Teste eq null and not(Date ne xx/xx/xx)

工作正常。问题是我必须用括号()对条件的某些部分进行分组。括号被忽略,它只是在没有它的情况下写入条件。 例如,表达式(o => o.Name != null && o.Name == "Joe") || !(o.Date != DateTime.Now)变为$filter=Name ne null and Name eq 'Joe' or not(Date ne xx/xx/xx)

奇怪的是,ExpessionVisitor似乎没有标识括号,NodeType不是!(expression),但它没有(expression)

我一直在谷歌上搜索这两天,我似乎无法找到答案。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

not的节点类型不适用于!(expression)仅适用于!expression - 括号不属于它。

源代码中必须使用括号来指示所需的优先级。它们在表达式树中不是必需的,因为优先级是树中固有的。

如果你不介意有时候有额外的括号,你可以让你的字符串转换总是包含它们。因此,每次使用带有操作数表达式xy的OR或AND表达式时,只需将其转换为(x || y)(x && y),无条件地包括这些括号。它可能看起来不漂亮,但总会给你正确的优先权。