Linq:创建表达式的逻辑逆

时间:2011-11-07 10:39:46

标签: 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

我不知道我在做什么。任何人都可以填补空白吗?

1 个答案:

答案 0 :(得分:17)

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

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

请改为尝试:

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