You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中字符串形式逻辑二元表达式的参数类型校验实现方法

实现表达式参数类型校验的可行方案

完全可以实现表达式参数的类型推断与前置校验,不需要等表达式运行求值时才暴露类型错误,常见实现路径分两类:

基于现有NReco.LambdaParser扩展实现校验

之前碰到的校验失效问题,核心原因是没有给解析器传入预定义参数的强类型元数据,默认解析器会把未识别的符号当成动态类型处理,自然不会检查类型匹配性。具体改造步骤:

  • 提前维护预定义参数的类型映射表,明确每个用户可使用参数的固定CLR类型,例如:
    var paramTypeMap = new Dictionary<string, Type> { {"isSuperAdmin", typeof(bool)}, {"userLevel", typeof(int)}, {"isAdmin", typeof(bool)} };
  • 给LambdaParser配置符号解析校验规则,利用自带的SymbolValidator钩子拦截所有表达式中的符号:
    • 若符号不在预定义参数列表中,直接抛出“不支持的参数名”异常
    • 若匹配到参数,直接绑定对应强类型的ParameterExpression,替换默认的动态符号解析逻辑
  • 解析完成拿到Expression树后,执行一次全节点的类型一致性遍历校验:
    • 检查逻辑运算符(&&、||)两侧的操作数是否为布尔类型
    • 检查比较运算符(>、<、==等)两侧操作数的类型是否匹配运算规则
    • 一旦发现类型不匹配(例如布尔类型参数和整数做大小比较),直接抛出带明确提示的校验异常

替换为内置强类型校验能力的解析组件

如果不想在NReco基础上做自定义扩展,可以选择本身支持静态类型校验的表达式解析组件,这类组件在语法解析阶段就会完成全链路的类型检查:

  • 支持强类型符号注册的解析引擎:在解析表达式前,提前把所有参数的类型注册到解析器上下文,解析过程中遇到不符合类型规则的表达式片段(比如isAdmin > 33)时,会直接在解析环节抛出类型错误,无需等到运行时求值。
  • 基于Roslyn构建的表达式校验方案:直接复用Roslyn的脚本编译能力做表达式校验,将预定义参数作为编译期全局变量传入,完全复用C#原生的类型运算规则,校验准确性和C#语言保持一致。

注意:所有类型校验动作必须前置到用户提交表达式的校验环节完成,不能延后到表达式实际执行的阶段,避免出现表达式部分执行、触发副作用后才报类型错误的问题。

内容的提问来源于stack exchange,提问作者mihalios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 22:45:08