我在API上声明了一个Enum,如下所示:
public enum Currencies
{
RON = 1,
USD,
EUR,
GBP,
CHF,
PLN,
CAD,
HUF,
NOK,
SEK
}但是,当我使用NSwag生成一个HttpClient时,它从0开始,并获得以下结果:
public enum Currencies
{
[System.Runtime.Serialization.EnumMember(Value = @"RON")]
RON = 0,
[System.Runtime.Serialization.EnumMember(Value = @"USD")]
USD = 1,
[System.Runtime.Serialization.EnumMember(Value = @"EUR")]
EUR = 2,
[System.Runtime.Serialization.EnumMember(Value = @"GBP")]
GBP = 3,
[System.Runtime.Serialization.EnumMember(Value = @"CHF")]
CHF = 4,
[System.Runtime.Serialization.EnumMember(Value = @"PLN")]
PLN = 5,
[System.Runtime.Serialization.EnumMember(Value = @"CAD")]
CAD = 6,
[System.Runtime.Serialization.EnumMember(Value = @"HUF")]
HUF = 7,
[System.Runtime.Serialization.EnumMember(Value = @"NOK")]
NOK = 8,
[System.Runtime.Serialization.EnumMember(Value = @"SEK")]
SEK = 9,
}生成的一个从0开始,而最初的一个从1开始。当我试图调用api时,这会导致验证问题。我怎么才能映射这个呢?
发布于 2022-09-27 18:13:46
有些解决方案可以在Stackoverflow中找到,但我与它们进行了斗争,并希望继续讨论如何将这里的内容传递给解决方案。真正重要的是,要删除--这段代码当然有:
services.AddMvc().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});也可能是您的swagger配置中的下面一行
c.DescribeAllEnumsAsStrings()当您这样做时,生成的代码将如下所示
public enum Currencies
{
_1 = 1,
_2 = 2,
_3 = 3,
_4 = 4,
_5 = 5,
_6 = 6,
_7 = 7,
_8 = 8,
_9 = 9
}现在您的值是正确的,问题在于名称。因此,您可以使用这里描述的解决方案:https://stackoverflow.com/a/71526271/9466394并实现NSwagEnumExtensionSchemaFilter和NSwagEnumOpenApiExtension惠奇添加"x-enumNames“模式的详细信息。
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
/// <summary>
/// Adds extra schema details for an enum in the swagger.json i.e. x-enumNames (used by NSwag to generate Enums for C# client)
/// https://github.com/RicoSuter/NSwag/issues/1234
/// </summary>
public class NSwagEnumExtensionSchemaFilter : ISchemaFilter
{
public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
if (schema is null)
throw new ArgumentNullException(nameof(schema));
if (context is null)
throw new ArgumentNullException(nameof(context));
if (context.Type.IsEnum)
schema.Extensions.Add("x-enumNames", new NSwagEnumOpenApiExtension(context));
}
}using System.Text.Json;
using Microsoft.OpenApi;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Writers;
using Swashbuckle.AspNetCore.SwaggerGen;
public class NSwagEnumOpenApiExtension : IOpenApiExtension
{
private readonly SchemaFilterContext _context;
public NSwagEnumOpenApiExtension(SchemaFilterContext context)
{
_context = context;
}
public void Write(IOpenApiWriter writer, OpenApiSpecVersion specVersion)
{
string[] enums = Enum.GetNames(_context.Type);
JsonSerializerOptions options = new() { WriteIndented = true };
string value = JsonSerializer.Serialize(enums, options);
writer.WriteRaw(value);
}
}services.AddSwaggerGen(c =>
{
...
c.SchemaFilter<NSwagEnumExtensionSchemaFilter>();
});现在,生成的代码如下所示:
public enum Currencies
{
[System.Runtime.Serialization.EnumMember(Value = @"RON")]
RON = 1,
[System.Runtime.Serialization.EnumMember(Value = @"USD")]
USD = 2,
[System.Runtime.Serialization.EnumMember(Value = @"EUR")]
EUR = 3,
[System.Runtime.Serialization.EnumMember(Value = @"GBP")]
GBP = 4,
[System.Runtime.Serialization.EnumMember(Value = @"CHF")]
CHF = 5,
[System.Runtime.Serialization.EnumMember(Value = @"PLN")]
PLN = 6,
[System.Runtime.Serialization.EnumMember(Value = @"CAD")]
CAD = 7,
[System.Runtime.Serialization.EnumMember(Value = @"HUF")]
HUF = 8,
[System.Runtime.Serialization.EnumMember(Value = @"NOK")]
NOK = 9,
[System.Runtime.Serialization.EnumMember(Value = @"SEK")]
SEK = 10
}您还可以添加EnumDocumentFilter,如果您想要您的傲慢完全干净
https://stackoverflow.com/questions/70868216
复制相似问题