ExpressionHelper.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System.Linq.Expressions;
  2. namespace IES.ExamServer
  3. {
  4. public static class ExpressionHelper
  5. {
  6. public static Expression<Func<T, bool>> And<T>( this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
  7. {
  8. // 创建一个新的参数表达式
  9. var parameter = Expression.Parameter(typeof(T), "x");
  10. // 替换第一个表达式中的参数
  11. var leftVisitor = new ReplaceParameterVisitor(first.Parameters[0], parameter);
  12. var left = leftVisitor.Visit(first.Body);
  13. // 替换第二个表达式中的参数
  14. var rightVisitor = new ReplaceParameterVisitor(second.Parameters[0], parameter);
  15. var right = rightVisitor.Visit(second.Body);
  16. // 组合两个表达式
  17. var combined = Expression.AndAlso(left, right);
  18. // 创建新的 lambda 表达式
  19. return Expression.Lambda<Func<T, bool>>(combined, parameter);
  20. }
  21. public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
  22. {
  23. // 创建一个新的参数表达式
  24. var parameter = Expression.Parameter(typeof(T), "x");
  25. // 替换第一个表达式中的参数
  26. var leftVisitor = new ReplaceParameterVisitor(first.Parameters[0], parameter);
  27. var left = leftVisitor.Visit(first.Body);
  28. // 替换第二个表达式中的参数
  29. var rightVisitor = new ReplaceParameterVisitor(second.Parameters[0], parameter);
  30. var right = rightVisitor.Visit(second.Body);
  31. // 组合两个表达式
  32. var combined = Expression.OrElse(left, right);
  33. // 创建新的 lambda 表达式
  34. return Expression.Lambda<Func<T, bool>>(combined, parameter);
  35. }
  36. private class ReplaceParameterVisitor : ExpressionVisitor
  37. {
  38. private readonly ParameterExpression _oldParameter;
  39. private readonly ParameterExpression _newParameter;
  40. public ReplaceParameterVisitor(ParameterExpression oldParameter, ParameterExpression newParameter)
  41. {
  42. _oldParameter = oldParameter;
  43. _newParameter = newParameter;
  44. }
  45. protected override Expression VisitParameter(ParameterExpression node)
  46. {
  47. // 如果遇到旧的参数,替换为新的参数
  48. if (node == _oldParameter)
  49. return _newParameter;
  50. return base.VisitParameter(node);
  51. }
  52. }
  53. }
  54. }