Linq: Erstellen Sie eine logische Umkehrung des Ausdrucks

c# expression-trees linq

Frage

Ich möchte eine Methode erstellen, die einen Expression<Func<T, bool>> akzeptiert und die logische Umkehrung von ihr erzeugt (dh sie würde false wo sie true wäre und umgekehrt. Dies ist viel schwieriger als ich dachte Hier gehe ich hin:

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

Dies kompiliert, aber löst beim Aufruf folgende Ausnahme aus:

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

Ich habe keine Ahnung was ich tue. Kann jemand die Lücken ausfüllen?

Akzeptierte Antwort

Sie rufen Expression.Lambda auf, um einen Ausdruck ohne Parameter zu erstellen, wenn Sie den einzelnen Parameter des Quellausdrucks weiterleiten möchten.

Beachten Sie, dass wir versuchen, einen Expression<Func<T, bool>> und nicht einen Expression<Func<bool>> zu erstellen.

Versuchen Sie es stattdessen:

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow