上一篇net core 2.2 swagger的枚舉描述,core 3.0 須要升級swagger到5.0rc版,配置須要作些修改,swaager啓用了OpenApi標準,以前的枚舉描述方法也失效了。orm
這裏經過了反射程序集,獲取全部枚舉定義放入字典,而後經過OpenApiSchema.Key來查表找到對應的枚舉類型,經過Microsoft.OpenApi.Any.OpenApiInteger.Value強轉會枚舉,再補寫枚舉對應的描述。blog
/// <summary> /// 基本狀態 /// </summary> public enum BaseStatusEnum { /// <summary> /// 邏輯刪除狀態 /// </summary> [Description("邏輯刪除狀態")] LogicDelete = -1, /// <summary> /// 默認,未處理 /// </summary> [Description("默認,未處理")] Normal = 0, /// <summary> /// 已處理 /// </summary> [Description("已處理")] Processed = 1 }
完整的Filter以下:ip
/// <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; } }