>本文探討了使用C#中邏輯運算符組合兩個對象的方法。 直接使用Expression<Func<bool>>
或AND
>是不可能的。相反,使用OR
,Expression.AndAlso
和OrElse
。 當表達式使用不同的參數時,複雜性會增加。 提出了三種解決方案:Not
>結合兩個布爾表達式
挑戰在於使用邏輯和或不使用兩個對象組合兩個對象。 一種簡單的方法,例如>是無效的。 Expression<Func<bool>>
expr1 AND expr2
幾種方法解決以下方法:
方法1:使用Invoke
>
方法在公共參數上下文中執行每個表達式。 Invoke
>
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; }
方法2:參數替換(條件)>
此方法檢查表達式是否共享相同的參數。如果是這樣,則使用更簡單的。否則,它使用第一個參數來調用第二個表達式。 AndAlso
>
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); }
方法3:ExpressionVisitor
>
在一個表達式中系統地替換參數以匹配另一個參數,然後再應用ExpressionVisitor
>。 AndAlso
。
public static Expression<Func<bool>> AndAlso<T>( this Expression<Func<bool>> expr1, Expression<Func<bool>> expr2) { var parameter = Expression.Parameter(typeof(T)); var leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], parameter); var left = leftVisitor.Visit(expr1.Body); var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter); var right = rightVisitor.Visit(expr2.Body); return Expression.Lambda<Func<bool>>( Expression.AndAlso(left, right), parameter); } private class ReplaceExpressionVisitor : ExpressionVisitor { private readonly Expression _oldValue; private readonly Expression _newValue; public ReplaceExpressionVisitor(Expression oldValue, Expression newValue) { _oldValue = oldValue; _newValue = newValue; } public override Expression Visit(Expression node) { if (node == _oldValue) return _newValue; return base.Visit(node); } }
以上是如何使用邏輯運算符組合兩個表達式對象?的詳細內容。更多資訊請關注PHP中文網其他相關文章!