C#常用三方库使用心得

发布时间:2026/5/22 20:43:20

C#常用三方库使用心得 三方库RulesEnginerule字段字段用途场景示例RuleName规则标识“HighTemperatureWarning”Expression判断条件telemetry.Temperature 40SuccessEvent成功时返回“TEMP_WARNING”ErrorMessage失败信息“传感器读数异常”Actions后置动作启动空调、发送短信LocalParams中间变量计算变化率、平均值lambda表达式语法上就是动态LINQ。表达式传参ruleDefinitions.Add(new Rule { RuleName rule1, Expression $v $threshold, ErrorMessage Value must be less than $threshold, SuccessEvent error }); // 准备输入数据 RuleParameter[] input [new($v, 50), new($threshold, 40)]; // 执行规则检查 var results await rulesEngine.ExecuteAllRulesAsync(AlarmRules, input);RuleEngine编译规则表达式的关键逻辑在namespace RulesEngine.ExpressionBuilders的RuleExpressionParser.cs的Parse函数里public Expression Parse(string expression, ParameterExpression[] parameters, Type returnType) { ParsingConfig parsingConfig new ParsingConfig() { CustomTypeProvider (IDynamicLinqCustomTypeProvider) new CustomTypeProvider(this._reSettings.CustomTypes), IsCaseSensitive this._reSettings.IsExpressionCaseSensitive }; try { // 这个ExpressionParser就是System.Linq.Dynamic.Core库里解析动态LINQ的解析器 return new ExpressionParser(parameters, expression, Array.Emptyobject(), parsingConfig).Parse(returnType); } catch (ParseException ex)...规则表达式的校验规则表达式实际上是一个动态LINQ可使用System.Linq.Dynamic.Core库的DynamicExpressionParser.ParseLambda来校验该函数最终也会调用ExpressionParser.Parse来解析规则字符串public static LambdaExpression ParseLambda( Type? delegateType, ParsingConfig? parsingConfig, bool createParameterCtor, ParameterExpression[] parameters, Type? resultType, string expression, params object?[]? values) { ... ExpressionParser expressionParser new ExpressionParser(parameters, expression, values, parsingConfig); Expression expression1 expressionParser.Parse(resultType, createParameterCtor); //如果是lambda表达式则返回 if (expression1 is LambdaExpression lambda) return lambda; if (parsingConfig ! null parsingConfig.RenameParameterExpression parameters.Length 1) { ParameterExpression parameterExpression; Expression body new ParameterExpressionRenamer(expressionParser.LastLambdaItName).Rename(expression1, out parameterExpression); return !(delegateType (Type) null) ? Expression.Lambda(delegateType, body, parameterExpression) : Expression.Lambda(body, parameterExpression); } // 如果不是构造一个lambda表达式返回 return !(delegateType (Type) null) ? Expression.Lambda(delegateType, expression1, parameters) : Expression.Lambda(expression1, parameters); }lambda表达式与C#语法的差异基本上与C#语法是类似的但由于动态LINQ是单独解析的而不是用C#的Roslyn编译器所以还是有些区别目前发现的double类型也能进行位操作而这一点在C#里编译都不过原因是动态LINQ会自动把double截断为整型。类型转换用int(v)而不像C#里那样(int)vIMemoryCache组件过期策略策略类型说明适用场景绝对过期固定时间点过期数据在特定时间后失效如整点更新相对过期从缓存写入开始计时数据在一段时间后失效滑动过期每次访问重置计时器热点数据长时间不访问则清除组合策略绝对滑动同时使用保证最终过期 活跃续期优先级内存压力时优先清除缓存驱逐时的权重控制全局性IMemoryCache是ASP.NET里的singleton服务相当于一个全局字典因此字典key的选择必须带上业务或租户隔离字段。

相关新闻