Quindi penso di avere un problema simile. Sto cercando spavalderia per generare enumerazioni insieme alla mappatura int -> string. L'API deve accettare l'int. La spavalderia-ui conta meno, quello che voglio veramente è la generazione di codice con un enum "reale" sull'altro lato (app Android che utilizzano retrofit in questo caso).
Quindi, dalla mia ricerca, questo alla fine sembra essere un limite della specifica OpenAPI che Swagger usa. Non è possibile specificare nomi e numeri per le enumerazioni.
Il miglior problema che ho trovato da seguire è https://github.com/OAI/OpenAPI-Specification/issues/681 che sembra un "forse presto" ma poi Swagger dovrebbe essere aggiornato, e nel mio caso Swashbuckle come bene.
Per ora la mia soluzione alternativa è stata quella di implementare un filtro del documento che cerca le enumerazioni e popola la descrizione pertinente con il contenuto dell'enumerazione.
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());
}
}
Ciò si traduce in qualcosa di simile al seguente nella tua interfaccia utente spavalda così almeno puoi "vedere cosa stai facendo":