méthodes PredicateBuilder clarification
-
26-09-2019 - |
Question
J'ai regardé par PredicateBuilder sources et sa mise en œuvre me rend curieux. look Let à la mise en œuvre ou méthode:
public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
}
Pourquoi est-il fait Invoke nouveau lambda au lieu d'utiliser OrElse pour le corps prédicat?
La solution
Je crois qu'il est une question de frappe: Expression.OrElse
renvoie une expression simple, pas un Expression<Func<T, bool>>
Autres conseils
Je ne suis pas sûr à 100% non plus, mais je pense que la question est d'assurer que chaque expression Func<T,bool>
est enchaînée, le paramètre qui est une instance de T , est toujours la même instance pour chaque expression.
En d'autres termes, pour:
(t1 => t1>5).And(t2 => t2.Color == Blue)
nous supposons t1 et t2 sont référentielle égaux, mais les InvocationExpression assure qu'ils sont essentiellement en disant: "créer une nouvelle expression qui appelle Expr2 avec le paramètre de Expr1 " .
Voir aussi PredicateBuilder revisité où l'auteur, collaborateur de Mono, vraiment explicitement les contrôles pour l'égalité de référence du paramètre.