Включите возможные значения перечисления в схемы Swagger Asp.net

В нашем веб-API ASP.net Core наши DTO имеют строковые свойства, допустимые значения которых определены в перечислениях. (Мы планируем изменить тип этих свойств на соответствующие перечисления, но пока это невозможно.)

В интересах наших потребителей API мы хотели бы, чтобы пользовательский интерфейс Swagger (Swashbuckle.AspNetCore) показывал возможные значения этих перечислений. Могу ли я настроить Swagger так, чтобы эти значения перечисления отображались в схеме (отдельно или в соответствующей схеме DTO) без изменения типа свойств?

public class FooDTO
{
    public int Id {get; set;}
    public string Color {get; set;} // Only has values of FooColor
    // ...
}


public enum FooColor
{
    Purple,
    Blue,
    Pink
}

Я бы хотел, чтобы значения FooColor отображались в схеме пользовательского интерфейса Swagger или вообще где угодно.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне помогла реализация следующего ISchemaFilter. Примечание: мой Json сериализует CamelCasing. Вот почему я добавил formattedPropertyName, приспосабливайтесь к вашим потребностям.

using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;


public class EnumSchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        // Check if the property is of type string and has a corresponding enum
        foreach (var property in context.Type.GetProperties().Where(p => p.PropertyType == typeof(string)))
        {
            var matchedConfig = GetEnumTypeAndName.FirstOrDefault(x => x.specifiedClass == context.Type
                && x.specifiedPropertyName == property.Name);

            if (matchedConfig == default)
                continue;

            // Get the enum type for the property
            Type enumType = matchedConfig.enumType;
            string formattedPropertyName = System.Text.Json.JsonNamingPolicy.CamelCase.ConvertName(property.Name);

            // Get the enum values and add them to the schema
            var enumValues = Enum.GetNames(enumType)
                .Select(name => new OpenApiString(name))
                .ToList<IOpenApiAny>();

            schema.Properties[formattedPropertyName].Enum = enumValues;

        }
    }

    private static List<(Type specifiedClass, string specifiedPropertyName, Type enumType)> GetEnumTypeAndName
    {
        get
        {
            {
                return new List<(Type, string, Type)>() {
                    (typeof(FooDTO), nameof(FooDTO.Color), typeof(FooColor))
                };
            }
        }
    }
}

И затем в Program.cs или Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });

        // Register the custom schema filter
        c.SchemaFilter<EnumSchemaFilter>();
    });
}

Другие вопросы по теме