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;
     }
}

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM