2015-06-08 88 views
6
public static Expression<Func<T, bool>> OrElse<T>(this 
          Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) 
{ 
    ParameterExpression parameter = Expression.Parameter(typeof(T)); 

    ReplaceExpressionVisitor leftVisitor = 
           new ReplaceExpressionVisitor(expr1.Parameters[0], parameter); 
    Expression left = leftVisitor.Visit(expr1.Body); 

    ReplaceExpressionVisitor rightVisitor = 
           new ReplaceExpressionVisitor(expr2.Parameters[0], parameter); 
    Expression right = rightVisitor.Visit(expr2.Body); 

    return Expression.Lambda<Func<T, bool>>(Expression.OrElse(left, right), parameter); 
} 

因爲我有另一種方法,其中唯一的區別就是在return語句表達,如何通過Expression.OrElse作爲參數傳遞給方法(我的其他方法使用AndAlso)?傳遞一個BinaryExpression作爲參數

由於方法接近完全相同,所以我希望將一個通用方法的表達式作爲參數傳遞。

我試過通過BinaryExpression沒有成功。

+0

嘗試使用對象。 – jdweng

回答

6

那該怎麼辦?

public static Expression<Func<T, bool>> BinaryOp<T>(this 
          Expression<Func<T, bool>> expr1, 
          Expression<Func<T, bool>> expr2, 
          Func<Expression, Expression, BinaryExpression> operation) 
{ 
    ParameterExpression parameter = Expression.Parameter(typeof(T)); 

    ReplaceExpressionVisitor leftVisitor = 
       new ReplaceExpressionVisitor(expr1.Parameters[0], parameter); 
    Expression left = leftVisitor.Visit(expr1.Body);  
    ReplaceExpressionVisitor rightVisitor = 
       new ReplaceExpressionVisitor(expr2.Parameters[0], parameter); 

    Expression right = rightVisitor.Visit(expr2.Body); 

    return Expression.Lambda<Func<T, bool>>(operation(left, right), parameter); 
} 

public static Expression<Func<T, bool>> OrElse<T>(this 
          Expression<Func<T, bool>> expr1, 
          Expression<Func<T, bool>> expr2) 
{ 
    return BinaryOp(expr1, expr2, Expression.OrElse); // passed as mth group 
} 

public static Expression<Func<T, bool>> AndAlso<T>(this 
          Expression<Func<T, bool>> expr1, 
          Expression<Func<T, bool>> expr2) 
{ 
    return BinaryOp(expr1, expr2, Expression.AndAlso); // passed as mth group 
} 
+0

非常好,謝謝! – filur