1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- using System.Linq.Expressions;
- namespace IES.ExamServer
- {
- public static class ExpressionHelper
- {
-
- public static Expression<Func<T, bool>> And<T>( this Expression<Func<T, bool>> first, Expression<Func<T, bool>> 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<Func<T, bool>>(combined, parameter);
- }
- public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> 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<Func<T, bool>>(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);
- }
- }
- }
- }
|