Utils.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using NCalc;
  2. public class Utils
  3. {
  4. #region 打控制台日志
  5. public static void WriteLog(string msg, string filename = "message")
  6. {
  7. Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "--" + filename + "--" + msg);
  8. }
  9. #endregion
  10. /// <summary>
  11. /// 解析布尔表达式,返回 true/false
  12. /// 支持的表达式示例:"10 > 5", "a == b", "(1+2) < 10 && 3 != 4", "true || false"
  13. /// </summary>
  14. /// <param name="booleanExpression">布尔表达式字符串</param>
  15. /// <param name="parameters">可选:表达式中的变量参数(如 a=10, b=5)</param>
  16. /// <returns>表达式的布尔结果</returns>
  17. public static bool EvaluateBoolean(string booleanExpression, Dictionary<string, object> parameters = null)
  18. {
  19. try
  20. {
  21. // 创建表达式对象
  22. var expr = new Expression(booleanExpression);
  23. // 2. 【强制绑定】直接绑定函数事件(不抽离,避免绑定失效)
  24. expr.EvaluateFunction += OnEvaluateFunction;
  25. // 注入变量参数(如果有)
  26. if (parameters != null && parameters.Count > 0)
  27. {
  28. foreach (var param in parameters)
  29. {
  30. expr.Parameters[param.Key] = param.Value;
  31. }
  32. }
  33. // 执行表达式并转换为布尔值
  34. var result = expr.Evaluate();
  35. return Convert.ToBoolean(result);
  36. }
  37. catch (Exception ex)
  38. {
  39. throw new ArgumentException($"布尔表达式解析失败:{booleanExpression},错误:{ex.Message}", ex);
  40. }
  41. }
  42. /// <summary>
  43. /// 核心函数处理逻辑(直接写,避免任何匹配误差)
  44. /// </summary>
  45. private static void OnEvaluateFunction(string funcName, FunctionArgs args)
  46. {
  47. // 注册 Contains 函数(核心新增)
  48. if (funcName == "Contains")
  49. {
  50. if (args.Parameters.Length != 2)
  51. {
  52. throw new ArgumentException("Contains 必须传入 2 个参数:字符串、子串");
  53. }
  54. // 安全获取参数(避免 null/空字符串解析问题)
  55. var str = args.Parameters[0].Evaluate()?.ToString() ?? string.Empty;
  56. var subStr = args.Parameters[1].Evaluate()?.ToString() ?? string.Empty;
  57. args.Result = str.Contains(subStr);
  58. return;
  59. }
  60. // 方案1:精准匹配(表达式写 StartsWith 就匹配 StartsWith)
  61. if (funcName == "StartsWith")
  62. {
  63. // 严格校验参数数量
  64. if (args.Parameters.Length != 2)
  65. {
  66. throw new ArgumentException("StartsWith 必须传入 2 个参数:字符串、前缀");
  67. }
  68. // 安全获取参数值(避免 null)
  69. var str = args.Parameters[0].Evaluate()?.ToString() ?? string.Empty;
  70. var prefix = args.Parameters[1].Evaluate()?.ToString() ?? string.Empty;
  71. // 执行原生 StartsWith
  72. args.Result = str.StartsWith(prefix);
  73. return;
  74. }
  75. // 方案1:精准匹配 IsNullOrEmpty
  76. if (funcName == "IsNullOrEmpty")
  77. {
  78. if (args.Parameters.Length != 1)
  79. {
  80. throw new ArgumentException("IsNullOrEmpty 必须传入 1 个参数:字符串");
  81. }
  82. var value = args.Parameters[0].Evaluate()?.ToString();
  83. args.Result = string.IsNullOrEmpty(value);
  84. return;
  85. }
  86. // 未找到函数时明确报错
  87. throw new ArgumentException($"未定义函数:{funcName}");
  88. }
  89. }