Linq: Crée l'inverse logique de l'expression

c# expression-trees linq

Question

Je voudrais créer une méthode qui accepte une Expression<Func<T, bool>> et en crée l'inverse logique (c.-à-d. Qu'elle renvoie false où elle aurait été true , et inversement. C'est beaucoup plus difficile que je ne le pensais C'est là que je suis en train de:

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

Ceci compile bien mais lève l'exception suivante lorsqu'elle est appelée:

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

Je n'ai aucune idée de ce que je fais. Quelqu'un pourrait-il remplir les blancs?

Réponse acceptée

Vous appelez Expression.Lambda pour créer une expression sans aucun paramètre, alors que vous devez transférer le paramètre unique de l'expression source.

Notez que nous essayons de créer une Expression<Func<T, bool>> et non une Expression<Func<bool>> .

Essayez ceci à la place:

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow