Linq: Crear inverso lógico de expresión

c# expression-trees linq

Pregunta

Me gustaría crear un método que acepte una Expression<Func<T, bool>> y cree el inverso lógico de la misma (es decir, devolvería false donde habría devuelto true y viceversa. Esto es mucho más difícil de lo que pensé Aquí es donde estoy hasta:

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

Esto compila bien pero lanza la siguiente excepción cuando se llama:

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

No tengo ni idea de lo que estoy haciendo. ¿Alguien podría llenar los espacios en blanco?

Respuesta aceptada

Está llamando a Expression.Lambda para crear una expresión sin parámetros, cuando debería reenviar el único parámetro de la expresión de origen.

Tenga en cuenta que estamos intentando crear una Expression<Func<T, bool>> y no una Expression<Func<bool>> .

Intenta esto en su lugar:

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow