如何结合使用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.
相关产品推荐
相关产品推荐

