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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top