Lambda表达式构建规则引擎的核心是将业务规则转为可编译、缓存、组合的Expression树,通过语义化参数、预编译缓存和上下文快照实现动态、高效、可维护的实时求值。

用Lambda表达式构建规则驱动的变量动态计算引擎,核心在于把业务规则转成可编译、可缓存、可组合的表达式树,并通过输入上下文实时求值。它不是写死逻辑,而是让规则本身成为数据——可配置、可热更新、可审计。
规则建模:用Lambda代替硬编码条件
把每个计算逻辑抽象为一个 Func
- 基础规则:(user) => user.BaseSalary * (1 + user.PerformanceBonus)
- 带条件分支:(user) => user.Level switch { 1 => user.BaseSalary * 1.05, 2 => user.BaseSalary * 1.12, _ => user.BaseSalary }
- 多输入协同:(user, dept) => user.YearsOfService > 5 && dept.Budget > 1000000 ? user.BaseSalary * 1.2 : user.BaseSalary
动态绑定:用 Expression> 支持运行时解析
直接使用 Func 委托虽快,但无法动态加载字符串规则。应优先采用 Expression 树:
- 将规则字符串(如 "input1.Age > 18 && input1.City == \"Beijing\"")解析为 Expression
> - 调用 Compile() 得到可执行委托,首次编译后可缓存复用
- RulesEngine 等框架底层正是基于此机制,ExpressionParser.cs 负责语法校验与类型绑定
参数解耦:用 RuleParameter 替代 input1/input2 占位符
避免规则中硬写 input1.Address.Street 这类难读名称,改用语义化命名:
- 定义参数容器:new RuleParameter("employee", emp), new RuleParameter("company", comp)
- 规则表达式中直接写:employee.Salary > company.AvgSalary * 1.3
- 引擎自动完成变量映射,提升可维护性与协作效率
执行优化:预编译 + 上下文快照 + 异步批处理
高频调用场景必须规避重复解析开销:
- 所有规则在初始化阶段完成 Compile(),缓存到 ConcurrentDictionary
- 对输入对象做轻量快照(如只提取所需属性),减少 Expression 访问深度
- 批量计算时用 Task.WhenAll 并行触发多个规则,再聚合结果










