首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSwag Enum生成从0开始

NSwag Enum生成从0开始
EN

Stack Overflow用户
提问于 2022-01-26 18:05:14
回答 1查看 171关注 0票数 2

我在API上声明了一个Enum,如下所示:

代码语言:javascript
复制
 public enum Currencies
    {
        RON = 1,
        USD,
        EUR,
        GBP,
        CHF,
        PLN,
        CAD,
        HUF,
        NOK,
        SEK
    }

但是,当我使用NSwag生成一个HttpClient时,它从0开始,并获得以下结果:

代码语言:javascript
复制
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时,这会导致验证问题。我怎么才能映射这个呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-27 18:13:46

有些解决方案可以在Stackoverflow中找到,但我与它们进行了斗争,并希望继续讨论如何将这里的内容传递给解决方案。真正重要的是,要删除--这段代码当然有:

代码语言:javascript
复制
        services.AddMvc().AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
        });

也可能是您的swagger配置中的下面一行

代码语言:javascript
复制
c.DescribeAllEnumsAsStrings()

当您这样做时,生成的代码将如下所示

代码语言:javascript
复制
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“模式的详细信息。

代码语言:javascript
复制
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));
    }
}

代码语言:javascript
复制
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);
    }
}

代码语言:javascript
复制
services.AddSwaggerGen(c =>
{
    ...
    c.SchemaFilter<NSwagEnumExtensionSchemaFilter>();
});

现在,生成的代码如下所示:

代码语言:javascript
复制
    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,如果您想要您的傲慢完全干净

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70868216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档