我创建了一个Swagger架构过滤器,如下所示:

public class OpenApiIgnoreEnumSchemaFilter : ISchemaFilter
{
    private readonly bool _useNames;

    public OpenApiIgnoreEnumSchemaFilter(bool useNames = false)
    {
        _useNames = useNames;
    }

    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (!context.Type.IsEnum && !(Nullable.GetUnderlyingType(context.Type)?.IsEnum ?? false))
        {
            return;
        }

        Type type = (context.Type.IsEnum ? context.Type : Nullable.GetUnderlyingType(context.Type));
        List<IOpenApiAny> list = new List<IOpenApiAny>();
        string[] names = Enum.GetNames(type);
        int[] values = Enum.GetValues(type).Cast<int>().ToArray();
        foreach (var (text, value) in names.Select((string name, int index) => (name, values[index])).ToList())
        {
            if (!type.GetMember(text)[0].GetCustomAttributes<OpenApiIgnoreEnumAttribute>().Any())
            {
                IOpenApiAny item;
                if (!_useNames)
                {
                    IOpenApiAny openApiAny = new OpenApiInteger(value);
                    item = openApiAny;
                }
                else
                {
                    IOpenApiAny openApiAny = new OpenApiString(text);
                    item = openApiAny;
                }

                list.Add(item);
            }
        }

        schema.Enum = list;
    }
}

它在一定程度上工作得很好--如果我将构造函数参数中的true值传递给它,并try 从浏览器中SwaggerUI的下拉列表中 Select 一个值,它会告诉我只允许整数值:

enter image description here

有没有办法让模式过滤器提供的功能(字符串化的枚举名称+隐藏一些我想要隐藏的成员),同时能够在UI中使用这些字符串化的枚举?

推荐答案

设置schema.Type = "string";schema.Format = null;

Swagger将显示枚举名,并将字符串值传递给API.控制器和序列化程序应该能够将枚举值作为字符串处理.

Csharp相关问答推荐

在Web API操作过滤器中在运行时获取未知类型

如果没有中间变量,可空引用类型将无法工作

我正在制作一个Unity游戏,如果对这个玩家控制器进行编码,但当它 skip 时,它会删除我的速度

无法使用并行库并行化我的代码

我可以 suppress 规则CS 9035一次吗?

禁用AutoSuggestBox项目更改时的动画?

如何循环遍历XML文档 node 以使用XSLT存储值

try 还原包时出错:Dapper已经为System.Data.SQLClient定义了依赖项''''

Amazon SP-API确认发货不设置&Quot;递送服务

System.Net.Http.HttpClient.SendAsync(request)在docker容器内的POST方法30秒后停止

如何将MemberInitExpression添加到绑定中其他Lambda MemberInitExpression

如何在.NET AOT中为所有枚举启用JsonStringEnumConverter

为什么此名称不再被识别?名称不存在于当前上下文中?

.NET 8在appsettings.json中核心使用词典URI、URI&>

如何从另一个类的列表中按ID取值

如何使用Npgsql从SELECT获得所有查询结果

Visual Studio,Docker容器-容器调用:连接被拒绝

如何使用.NET 8.0中新的CompositeFormat类?

ASP.NET核心8:app.UseStaticFiles()管道执行顺序

项目参考和方法签名问题