dotnet core 3.0 swagger 显示枚举描述
上一篇net core 2.2 swagger的枚举描述,core 3.0 需要升级swagger到5.0rc版,配置需要做些修改,swaager启用了OpenApi标准,之前的枚举描述方法也失效了。
这里通过了反射程序集,获取所有枚举定义放入字典,然后通过OpenApiSchema.Key来查表找到对应的枚举类型,通过Microsoft.OpenApi.Any.OpenApiInteger.Value强转会枚举,再补写枚举对应的描述。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /// <summary> /// 基本状态 /// </summary> public enum BaseStatusEnum { /// <summary> /// 逻辑删除状态 /// </summary> [Description( "逻辑删除状态" )] LogicDelete = -1, /// <summary> /// 默认,未处理 /// </summary> [Description( "默认,未处理" )] Normal = 0, /// <summary> /// 已处理 /// </summary> [Description( "已处理" )] Processed = 1 } |
完整的Filter如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | /// <summary> /// Add enum value descriptions to Swagger /// </summary> public class SwaggerEnumFilter : IDocumentFilter { public void Apply(Microsoft.OpenApi.Models.OpenApiDocument swaggerDoc, DocumentFilterContext context) //public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context) { Dictionary< string , Type> dict = GetAllEnum(); foreach ( var item in swaggerDoc.Components.Schemas) //foreach (var item in swaggerDoc.Definitions) { var property = item.Value; var typeName = item.Key; Type itemType = null ; if (property.Enum != null && property.Enum.Count > 0) { if (dict.ContainsKey(typeName)) { itemType = dict[typeName]; } else { itemType = null ; } List<OpenApiInteger> list = new List<OpenApiInteger>(); foreach ( var val in property.Enum) { list.Add((OpenApiInteger)val); } property.Description += DescribeEnum(itemType, list); } } } private static Dictionary< string , Type> GetAllEnum() { Assembly ass = Assembly.Load( "Test.Model" ); Type[] types = ass.GetTypes(); Dictionary< string , Type> dict = new Dictionary< string , Type>(); foreach (Type item in types) { if (item.IsEnum) { dict.Add(item.Name, item); } } return dict; } private static string DescribeEnum(Type type, List<OpenApiInteger> enums) { var enumDescriptions = new List< string >(); foreach ( var item in enums) { if (type == null ) continue ; var value = Enum.Parse(type, item.Value.ToString()); var desc = GetDescription(type, value); if ( string .IsNullOrEmpty(desc)) enumDescriptions.Add($ "{item.Value.ToString()}:{Enum.GetName(type, value)}; " ); else enumDescriptions.Add($ "{item.Value.ToString()}:{Enum.GetName(type, value)},{desc}; " ); } return $ "<br/>{Environment.NewLine}{string.Join(" <br/> " + Environment.NewLine, enumDescriptions)}" ; } private static string GetDescription(Type t, object value) { foreach (MemberInfo mInfo in t.GetMembers()) { if (mInfo.Name == t.GetEnumName(value)) { foreach (Attribute attr in Attribute.GetCustomAttributes(mInfo)) { if (attr.GetType() == typeof (DescriptionAttribute)) { return ((DescriptionAttribute)attr).Description; } } } } return string .Empty; } } |
分类:
dotnet core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人