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

  

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章