从 Swagger 中排除特定的 Enum 值

Rob*_*nes 4 .net c# enums swagger swashbuckle

我总是Uninitialized向所有枚举添加一个值,并将其设置为0处理反序列化具有从未设置的枚举属性值的对象的情况。

enum MyEnum
{
    Uninitialized = 0,
    MyEnumValue1 = 1,
    MyEnumValue2 = 2,
    MyEnumValue3 = 3,
}
Run Code Online (Sandbox Code Playgroud)

但是,我不希望该Uninitialized值显示在我的 Swagger 文档中。

我尝试将[JsonIgnore]属性添加到该值,但这不起作用。

有人知道如何做到这一点吗?

Roy*_*n46 12

以防万一其他人遇到这个问题。您可以创建自定义 SchemaFilter 并Enum使用自定义属性填充这些枚举值的属性过滤(在此示例中:OpenApiIgnoreEnumAttribute)。

    public class OpenApiIgnoreEnumSchemaFilter : ISchemaFilter
    {
        public void Apply(OpenApiSchema schema, SchemaFilterContext context)
        {
            if (context.Type.IsEnum)
            {
                var enumOpenApiStrings = new List<IOpenApiAny>();

                foreach (var enumValue in Enum.GetValues(context.Type))
                {
                    var member = context.Type.GetMember(enumValue.ToString())[0];
                    if (!member.GetCustomAttributes<OpenApiIgnoreEnumAttribute>().Any())
                    {
                        enumOpenApiStrings.Add(new OpenApiString(enumValue.ToString()));
                    }
                }

                schema.Enum = enumOpenApiStrings;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)
    public class OpenApiIgnoreEnumAttribute : Attribute
    {
    }
Run Code Online (Sandbox Code Playgroud)
    public enum ApplicationRole
    {
        [OpenApiIgnoreEnum]        
        DoNotExpose = 1,        
        ValueA = 2,        
        ValueB = 3,
    }
Run Code Online (Sandbox Code Playgroud)