using System.Linq.Expressions; namespace IES.ExamServer { public static class ExpressionHelper { public static Expression> And( this Expression> first, Expression> second) { // 创建一个新的参数表达式 var parameter = Expression.Parameter(typeof(T), "x"); // 替换第一个表达式中的参数 var leftVisitor = new ReplaceParameterVisitor(first.Parameters[0], parameter); var left = leftVisitor.Visit(first.Body); // 替换第二个表达式中的参数 var rightVisitor = new ReplaceParameterVisitor(second.Parameters[0], parameter); var right = rightVisitor.Visit(second.Body); // 组合两个表达式 var combined = Expression.AndAlso(left, right); // 创建新的 lambda 表达式 return Expression.Lambda>(combined, parameter); } public static Expression> Or(this Expression> first, Expression> second) { // 创建一个新的参数表达式 var parameter = Expression.Parameter(typeof(T), "x"); // 替换第一个表达式中的参数 var leftVisitor = new ReplaceParameterVisitor(first.Parameters[0], parameter); var left = leftVisitor.Visit(first.Body); // 替换第二个表达式中的参数 var rightVisitor = new ReplaceParameterVisitor(second.Parameters[0], parameter); var right = rightVisitor.Visit(second.Body); // 组合两个表达式 var combined = Expression.OrElse(left, right); // 创建新的 lambda 表达式 return Expression.Lambda>(combined, parameter); } private class ReplaceParameterVisitor : ExpressionVisitor { private readonly ParameterExpression _oldParameter; private readonly ParameterExpression _newParameter; public ReplaceParameterVisitor(ParameterExpression oldParameter, ParameterExpression newParameter) { _oldParameter = oldParameter; _newParameter = newParameter; } protected override Expression VisitParameter(ParameterExpression node) { // 如果遇到旧的参数,替换为新的参数 if (node == _oldParameter) return _newParameter; return base.VisitParameter(node); } } } }