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强转会枚举,再补写枚举对应的描述。
/// <summary> /// 基本状态 /// </summary> public enum BaseStatusEnum { /// <summary> /// 逻辑删除状态 /// </summary> [Description("逻辑删除状态")] LogicDelete = -1, /// <summary> /// 默认,未处理 /// </summary> [Description("默认,未处理")] Normal = 0, /// <summary> /// 已处理 /// </summary> [Description("已处理")] Processed = 1 }
完整的Filter如下:
/// <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; } }