ParameterExpressionVisitor.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Xml.Linq;
  8. namespace SqlSugar
  9. {
  10. internal class ParameterExpressionVisitor : ExpressionVisitor
  11. {
  12. public List<ParameterExpression> Parameters { get; } = new List<ParameterExpression>();
  13. protected override Expression VisitParameter(ParameterExpression node)
  14. {
  15. Parameters.Add(node);
  16. return base.VisitParameter(node);
  17. }
  18. }
  19. internal class MethodCallExpressionVisitor : ExpressionVisitor
  20. {
  21. private readonly string _methodName;
  22. private bool _hasMethodCallWithName;
  23. public MethodCallExpressionVisitor(string methodName)
  24. {
  25. _methodName = methodName;
  26. }
  27. public bool HasMethodCallWithName(Expression expression)
  28. {
  29. Visit(expression);
  30. return _hasMethodCallWithName;
  31. }
  32. protected override Expression VisitMethodCall(MethodCallExpression node)
  33. {
  34. if (node.Method.Name.Contains(_methodName))
  35. {
  36. _hasMethodCallWithName = true;
  37. return node;
  38. }
  39. return base.VisitMethodCall(node);
  40. }
  41. }
  42. internal class ExpressionTreeVisitor : ExpressionVisitor
  43. {
  44. private readonly List<Expression> _nodes = new List<Expression>();
  45. //protected override Expression VisitBinary(BinaryExpression node)
  46. //{
  47. // // 解析二元操作符表达式
  48. // _nodes.Add(node);
  49. // Visit(node.Left);
  50. // Visit(node.Right);
  51. // return node;
  52. //}
  53. //protected override Expression VisitConstant(ConstantExpression node)
  54. //{
  55. // // 解析常量表达式
  56. // _nodes.Add(node);
  57. // return node;
  58. //}
  59. protected override Expression VisitMember(MemberExpression node)
  60. {
  61. // 解析成员访问表达式
  62. _nodes.Add(node);
  63. return node;
  64. }
  65. protected override Expression VisitMethodCall(MethodCallExpression node)
  66. {
  67. // 解析方法调用表达式
  68. _nodes.Add(node);
  69. if (node.Arguments.Any())
  70. {
  71. Visit(node.Arguments.First());
  72. }
  73. return node;
  74. }
  75. public List<Expression> GetExpressions(Expression expression)
  76. {
  77. Visit(expression);
  78. _nodes.Reverse();
  79. return _nodes;
  80. }
  81. }
  82. }