.net core Swashbuckle( swagger) 枚举显示值改成显示枚举属性,以及枚举描述

只要在你的ConfigureServices中添加如下代码(两种方案都行)即可:

原创不易转载请注明转载地址,谢谢!

一、把枚举值改成枚举属性 

//方法一
services.AddMvc(option => option.EnableEndpointRouting = false).AddJsonOptions(options =>{
    options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
//方法二
services.AddControllers().AddJsonOptions(options =>
            options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));

没改之前

.net core Swashbuckle( swagger) 枚举显示值改成显示枚举属性,以及枚举描述_第1张图片

改了之后

.net core Swashbuckle( swagger) 枚举显示值改成显示枚举属性,以及枚举描述_第2张图片

枚举

public enum UserType
    {
        /// 
        /// 超级管理员
        /// 
        [Description("超级管理员")]
        Administrator = 1,
        /// 
        /// 高级管理员
        /// 
        [Description("管理员")]
        Admin = 2,
        /// 
        /// 用户
        /// 
        [Description("用户")]
        User = 3
    }

二、显示枚举描述

注意:里面的GetDescription方法时扩展方法,放在了后面

方法一:添加SwaggerEnumFilter类,继承IDocumentFilter,代码如下

using Microsoft.OpenApi.Any;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;

namespace DotNetCoreApi.Filter
{
    /// 
    /// swagger文档生成过滤器,用于枚举描述的生成
    /// 
    public class SwaggerEnumFilter : IDocumentFilter
    {
        /// 
        /// 实现IDocumentFilter接口的Apply函数
        /// 
        /// 
        /// 
        public void Apply(Microsoft.OpenApi.Models.OpenApiDocument swaggerDoc, DocumentFilterContext context)
        {
            Dictionary dict = GetAllEnum();

            foreach (var item in swaggerDoc.Components.Schemas)
            {
                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 list = new List();
                    foreach (var val in property.Enum)
                    {
                        list.Add((OpenApiInteger)val);
                    }
                    property.Description += DescribeEnum(itemType, list);
                }
            }
        }
        private static Dictionary GetAllEnum()
        {
            Assembly ass = Assembly.Load("Model");//枚举所在的命名空间的xml文件名,我的枚举都放在Model层里(类库)
            Type[] types = ass.GetTypes();
            Dictionary dict = new Dictionary();

            foreach (Type item in types)
            {
                if (item.IsEnum)
                {
                    dict.Add(item.Name, item);
                }
            }
            return dict;
        }

        private static string DescribeEnum(Type type, List enums)
        {
            var enumDescriptions = new List();
            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 $"
{Environment.NewLine}{string.Join("
" + 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; } } }

注册服务:在Startup中的ConfigureServices添加注册,如下

 services.AddSwaggerGen(c =>
{
    //省略其他代码
    c.DocumentFilter();
}

 

这种方法显示枚举描述如下

.net core Swashbuckle( swagger) 枚举显示值改成显示枚举属性,以及枚举描述_第3张图片

枚举如下

namespace Model.Enum
{
    /// 
    /// 用户类型枚举
    /// 

    public enum UserType
    {
        /// 
        /// 超级管理员
        /// 
        [Description("超级管理员")]
        Administrator = 1,
        /// 
        /// 高级管理员
        /// 
        [Description("管理员")]
        Admin = 2,
        /// 
        /// 用户
        /// 
        [Description("用户")]
        User = 3
    }
}

方法二:添加EnumSchemaFilter 类,实现 ISchemaFilter 接口,代码如下:

using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Util.Expand;

namespace DotNetCoreApi.Filter
{
    /// 
    /// Swagger文档枚举字段显示枚举属性和枚举值,以及枚举描述
    /// 
    public class EnumSchemaFilter : ISchemaFilter
    {
        /// 
        /// 实现接口
        /// 
        /// 
        /// 

        public void Apply(OpenApiSchema model, SchemaFilterContext context)
        {
            if (context.Type.IsEnum)
            {
                model.Enum.Clear();
                Enum.GetNames(context.Type)
                    .ToList()
                    .ForEach(name =>
                    {
                        Enum e = (Enum)Enum.Parse(context.Type, name);
                        model.Enum.Add(new OpenApiString($"{name}({e.GetDescription()})={Convert.ToInt64(Enum.Parse(context.Type, name))}"));
                    });
            }
        }

    }
}

 在Startup中的ConfigureServices添加注册,如下

 services.AddSwaggerGen(c =>
{
    //省略其他代码
    c.SchemaFilter();
}

效果如下:

.net core Swashbuckle( swagger) 枚举显示值改成显示枚举属性,以及枚举描述_第4张图片

到此结束...

你可能感兴趣的:(.NET,Core,swagger,枚举值转枚举属性,Swashbuckle)