2015-06-08 91 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