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

如何结合使用SmartEnum与NSwag并让NSwag为其生成枚举

NSwag 生成 SmartEnum 对应枚举定义的操作指引
  • 第一步:配置序列化转换器,保证SmartEnum的序列化/反序列化表现和原生枚举一致。根据你使用的序列化库注册对应的SmartEnum专用转换器,确保输出结果为枚举名称或枚举数值,而非完整的类结构。
  • 第二步:添加NSwag类型映射规则,将所有继承自SmartEnum的类统一识别为枚举类型。

示例代码(ASP.NET Core集成NSwag场景下Program.cs配置):

using System.Reflection;
using NJsonSchema;
using NSwag.Generation;

builder.Services.AddOpenApiDocument(settings =>
{
    // 插入SmartEnum类型映射,优先级高于默认规则
    settings.TypeMappers.Insert(0, new TypeMapper(typeof(SmartEnum<,>), context =>
    {
        // 反射获取当前SmartEnum子类的所有静态枚举实例
        var enumInstances = context.Type.GetFields(BindingFlags.Public | BindingFlags.Static)
            .Where(field => field.FieldType == context.Type)
            .Select(field => field.GetValue(null))
            .Cast<dynamic>()
            .ToList();
        
        return new JsonSchema
        {
            // 这里可以改为JsonObjectType.Integer生成数值类型枚举
            Type = JsonObjectType.String,
            // 枚举可选值集合
            Enum = enumInstances.Select(instance => (object)instance.Name).ToList(),
            // 额外存储枚举名称和数值的映射关系,方便客户端生成使用
            ExtensionData = new Dictionary<string, object>
            {
                ["x-enumNames"] = enumInstances.Select(instance => instance.Name).ToList(),
                ["x-enumValues"] = enumInstances.Select(instance => (int)instance.Value).ToList()
            }
        };
    }));
});
  • 如果你使用NSwag命令行工具生成客户端代码,在nswag.json配置文件中添加相同逻辑的类型映射规则即可生效。

注意:需要确保所有SmartEnum子类的静态实例在NSwag扫描时已经完成初始化,避免反射获取枚举值出现遗漏。你可以在程序启动阶段主动遍历程序集中的所有SmartEnum子类,触发其静态构造函数执行。

内容的提问来源于stack exchange,提问作者John L.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:27:03