传递BinaryExpression作为参数

本文关键字:参数 BinaryExpression 传递 | 更新日期: 2023-09-27 17:54:19

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);
}

既然我有另一种方法,其中唯一的区别是返回语句中的表达式,如何将Expression.OrElse作为参数传递给方法(我的其他方法使用AndAlso)?

由于方法几乎相同,我希望使用一个通用方法,将表达式作为参数传递。

我试过通过BinaryExpression考试,但没有成功。

传递BinaryExpression作为参数

怎么样?

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
}