Linq:创建表达式的逻辑逆

Dav*_*vid 9 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));
}
Run Code Online (Sandbox Code Playgroud)

这编译很好但在调用时会抛出以下异常:

Test method Tests.Common.Unit.LinqPredicateBuilderTests.CanInverseAPredicate threw exception: 
System.ArgumentException: Incorrect number of parameters supplied for lambda declaration
Run Code Online (Sandbox Code Playgroud)

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

Ani*_*Ani 17

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

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

试试这个:

return Expression.Lambda<Func<T, bool>>(Expression.Not(expression.Body),
                                        expression.Parameters);
Run Code Online (Sandbox Code Playgroud)