Jadi saya pikir saya memiliki masalah yang sama. Saya mencari kesombongan untuk menghasilkan enum bersama dengan int -> string mapping. API harus menerima int. Kesombongan-ui kurang penting, yang saya inginkan adalah pembuatan kode dengan enum "nyata" di sisi lain (aplikasi android menggunakan retrofit dalam kasus ini).
Jadi dari penelitian saya ini pada akhirnya tampaknya menjadi batasan spesifikasi OpenAPI yang digunakan Swagger. Tidak mungkin menentukan nama dan nomor untuk enum.
Masalah terbaik yang saya temukan untuk diikuti adalah https://github.com/OAI/OpenAPI-Specification/issues/681 yang terlihat seperti "mungkin segera" tetapi kemudian Swagger harus diperbarui, dan dalam kasus saya Swashbuckle sebagai baik.
Untuk saat ini solusi saya adalah menerapkan filter dokumen yang mencari enum dan mengisi deskripsi yang relevan dengan konten enum.
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.DocumentFilter<SwaggerAddEnumDescriptions>();
//disable this
//c.DescribeAllEnumsAsStrings()
SwaggerAddEnumDescriptions.cs:
using System;
using System.Web.Http.Description;
using Swashbuckle.Swagger;
using System.Collections.Generic;
public class SwaggerAddEnumDescriptions : IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
// add enum descriptions to result models
foreach (KeyValuePair<string, Schema> schemaDictionaryItem in swaggerDoc.definitions)
{
Schema schema = schemaDictionaryItem.Value;
foreach (KeyValuePair<string, Schema> propertyDictionaryItem in schema.properties)
{
Schema property = propertyDictionaryItem.Value;
IList<object> propertyEnums = property.@enum;
if (propertyEnums != null && propertyEnums.Count > 0)
{
property.description += DescribeEnum(propertyEnums);
}
}
}
// add enum descriptions to input parameters
if (swaggerDoc.paths.Count > 0)
{
foreach (PathItem pathItem in swaggerDoc.paths.Values)
{
DescribeEnumParameters(pathItem.parameters);
// head, patch, options, delete left out
List<Operation> possibleParameterisedOperations = new List<Operation> { pathItem.get, pathItem.post, pathItem.put };
possibleParameterisedOperations.FindAll(x => x != null).ForEach(x => DescribeEnumParameters(x.parameters));
}
}
}
private void DescribeEnumParameters(IList<Parameter> parameters)
{
if (parameters != null)
{
foreach (Parameter param in parameters)
{
IList<object> paramEnums = param.@enum;
if (paramEnums != null && paramEnums.Count > 0)
{
param.description += DescribeEnum(paramEnums);
}
}
}
}
private string DescribeEnum(IList<object> enums)
{
List<string> enumDescriptions = new List<string>();
foreach (object enumOption in enums)
{
enumDescriptions.Add(string.Format("{0} = {1}", (int)enumOption, Enum.GetName(enumOption.GetType(), enumOption)));
}
return string.Join(", ", enumDescriptions.ToArray());
}
}
Ini menghasilkan sesuatu seperti berikut pada swagger-ui Anda, jadi setidaknya Anda bisa "melihat apa yang Anda lakukan":