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

如何通过NSwag从OpenAPI可空开放枚举生成字符串字段与常量类?

解决NSwag处理可空开放枚举的代码生成问题

针对你遇到的OpenRouter OpenAPI规范中可空开放枚举的代码生成问题,以下是几个可行的解决方案:

1. 配置NSwag生成string?属性与字符串常量类

通过调整NSwag的生成配置,直接让工具输出符合需求的代码:

  • 在NSwag配置文件(如nswag.json)的CSharpGeneratorSettings节点中添加以下配置:
"CSharpGeneratorSettings": {
  "EnumHandling": "String",
  "GenerateNullableReferenceTypes": true,
  "GenerateStringEnumerationConstants": true,
  // 保留其他原有配置
}
  • 配置说明:
    • EnumHandling": "String":强制将枚举类型处理为字符串,而非C#枚举类型,兼容意外的字符串值
    • GenerateNullableReferenceTypes": true:启用可空引用类型,生成string?而非string,支持null值
    • GenerateStringEnumerationConstants": true:自动生成对应枚举值的字符串常量类(如EffortConstants),方便代码中引用标准枚举值

这样生成的代码中,reasoning类的effort属性会是string?类型,同时会生成包含Minimal = "minimal"、Low = "low"等常量的类,既满足可空要求,又能兼容非枚举定义的字符串值。

2. 调整OpenAPI Schema定义

如果无法修改NSwag配置,可以调整OpenAPI规范的Schema写法,改用OpenAPI 3.0+支持的nullable属性替代anyOf:

reasoning:
  type: object
  properties:
    effort:
      type: string
      enum:
        - minimal
        - low
        - medium
        - high
      nullable: true

这种写法更符合OpenAPI的标准规范,NSwag能直接识别为可空的字符串枚举,生成string?属性,同时保留枚举常量的生成。

3. 自定义NSwag模板(高级场景)

如果上述方案都无法满足需求,可以自定义NSwag的CSharp生成模板:

  • 找到NSwag的默认CSharp模板文件(通常在%AppData%\Roaming\NSwag\Templates目录下)
  • 修改模板中处理anyOf类型的逻辑,将包含字符串枚举和null的情况强制生成为string?类型,并手动添加常量类的生成代码
  • 在NSwag配置中指定使用自定义模板

这个方案适合需要高度定制代码生成逻辑的场景,但需要熟悉NSwag模板的语法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 00:33:20