Lorsque vous avez deux expressions de type
, vous devrez peut-être utiliser des opérateurs logiques (tels que et, ou ou non) pour les combiner. Cet article traite de diverses méthodes pour atteindre cet objectif.
Expression<Func<bool>>
La même instance de paramètre
Si les deux expressions utilisent le même , la combinaison est simple:
ParameterExpression
Ceci est également applicable à nier une seule opération:
var body = Expression.AndAlso(expr1.Body, expr2.Body); var lambda = Expression.Lambda<Func<bool>>(body, expr1.Parameters[0]);
<的> différents exemples de paramètres
static Expression<Func<bool>> Not<T>( this Expression<Func<bool>> expr) { return Expression.Lambda<Func<bool>>( Expression.Not(expr.Body), expr.Parameters[0]); }
Si l'expression utilise différentes instances de paramètres, vous pouvez utiliser pour combiner:
Cette méthode est également applicable à Invoke
et
static Expression<Func<bool>> AndAlso<T>( this Expression<Func<bool>> left, Expression<Func<bool>> right) { var param = Expression.Parameter(typeof(T), "x"); var body = Expression.AndAlso( Expression.Invoke(left, param), Expression.Invoke(right, param) ); var lambda = Expression.Lambda<Func<bool>>(body, param); return lambda; }
<用> Méthode générale OrElse
Not
du .NET 4.0,
static Expression<Func<bool>> AndAlso<T>( this Expression<Func<bool>> expr1, Expression<Func<bool>> expr2) { ParameterExpression param = expr1.Parameters[0]; if (ReferenceEquals(param, expr2.Parameters[0])) { return Expression.Lambda<Func<bool>>( Expression.AndAlso(expr1.Body, expr2.Body), param); } return Expression.Lambda<Func<bool>>( Expression.AndAlso( expr1.Body, Expression.Invoke(expr2, param)), param); }
En sélectionnant une méthode cohérente avec votre scène spécifique, vous pouvez combiner efficacement l'expression logique dans l'instance
.Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!