c# - Linq:创建表达式的逻辑逆

标签 c# linq expression-trees

我想创建一个接受 Expression<Func<T, bool>> 的方法并创建它的逻辑逆(即它会返回 false 它会返回 true ,反之亦然。这比我想象的要难得多。这就是我要做的:

public static Expression<Func<T, bool>> Not<T>(this Expression<Func<T, bool>> expression)
{
  return Expression.Lambda<Func<T, bool>>(Expression.Not(expression.Body));
}

这编译正常,但在调用时抛出以下异常:

Test method Tests.Common.Unit.LinqPredicateBuilderTests.CanInverseAPredicate threw exception: 
System.ArgumentException: Incorrect number of parameters supplied for lambda declaration

我不知道我在做什么。谁能填空?

最佳答案

您正在调用 Expression.Lambda当您应该转发源表达式的单个参数时,创建一个完全没有参数的表达式。

请注意,我们正在尝试创建一个 Expression<Func<T, bool>>而不是 Expression<Func<bool>> .

试试这个:

return Expression.Lambda<Func<T, bool>>(Expression.Not(expression.Body),
                                        expression.Parameters);

关于c# - Linq:创建表达式的逻辑逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8035287/

相关文章:

c# - 将媒体文件上传到 s3 包含自动压缩?

c# - 正则表达式以验证逗号分隔的字符串

linq - 查找一个列表中的所有对象,这些对象的属性与另一个对象列表中的属性相匹配

c# - 通过 linq 比较无值

c# - 在 Entity Framework 中组合表达式而不是使用多个查询

c - 解析器树或表达式树

c# - 在winforms中获取最大化版本的窗口大小

c# - 重试取消消息框

c# - LINQ 中棘手的字符串转换(希望如此)

c# - 假人的表达树?