传递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
考试,但没有成功。
怎么样?
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
}