web-dev-qa-db-ja.com

Swagger C#列挙型生成-基になるint値が元の列挙型と一致しません

サーバーで、デフォルト値の0からの増分ではなく、整数値を手動で設定した列挙型を作成しました

public enum UserType
{
    Anonymous = 0,
    Customer = 10,
    Technician = 21,
    Manager = 25,
    Primary = 30
}

私のサーバーはAspNetCore.App 2.2.0を使用して実行しています。サーバーが起動するたびにapiを記述するswagger jsonファイルを生成するように、swashbuckle aspnetcore 4.0.1を使用してStartup.csで構成されています。

次に、NSwag Studio for Windows v 13.2.3.0を使用して、Xamarinアプリで使用するために、そのSwagger JSONファイルでCシャープAPIクライアントを生成します。結果のcシャープAPIクライアントで生成された列挙型は次のようになります-基になる整数値が元の列挙型と一致しません。

[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")]
public enum UserType
{
    [System.Runtime.Serialization.EnumMember(Value = @"Anonymous")]
    Anonymous = 0,

    [System.Runtime.Serialization.EnumMember(Value = @"Customer")]
    Customer = 1,

    [System.Runtime.Serialization.EnumMember(Value = @"Technician")]
    Technician = 2,

    [System.Runtime.Serialization.EnumMember(Value = @"Manager")]
    Manager = 3,

    [System.Runtime.Serialization.EnumMember(Value = @"Primary")]
    Primary = 4,

}

整数値を知る必要がある状況があるため、これはクライアント側に問題を引き起こします。クライアント側で整数値を知りたいときに毎回コンバーターを作成することを回避できるソリューションを探しています。

オプション1:NSwag Studioまたは.net構成(私のStartup.Cs構成は参考のために以下にあります)で欠落しているオプションはありますか?生成された列挙を強制的に元の列挙と同じ整数値にすることができますか?

オプション2:または、そうでない場合、クライアントとサーバーの両方が共有クラスライブラリを介して同じ元の列挙型にアクセスできます。生成されたAPIクライアントが独自の列挙を生成するのではなく、apiclient.csの実際の元の列挙を使用する方法はありますか?

参照:

Startup.Csの私のswagger生成コードの列挙型部分は次のようになります

services.AddJsonOptions(options =>
                    {
                        options.
                            SerializerSettings.Converters.Add(new StringEnumConverter());
....

services.AddSwaggerGen(setup =>
                  {
                      setup.SwaggerDoc("v1", new Info { Title = AppConst.SwaggerTitle, Version = "v1" });
                      setup.UseReferencedDefinitionsForEnums();
                      ... other stuff...
                  }
3
Adam Diament

*更新*

dawood 以下の答えに、私が望んでいることを正確に実行する実用的なソリューションを投稿しました。

*元の回答*現在、これを行う方法はないようです。 @sellotapeが彼のコメントで述べたように、それは良い考えではないかもしれません。私はサーバーを制御していて、それは比較的新しいプロジェクトなので、列挙型を通常の「ゼロからの順次」スタイルにリファクタリングしました。

私はそれがいくつかのユースケースに役立つと思います-例えば簡単にリファクタリングできないレガシー列挙型、または中間にギャップがある列挙型に番号を付ける機能をサポートします。 10、20、30。これにより、後で11,12などを挿入できるようになりますが、プロジェクトの成長に合わせて、何らかの「順序」を列挙型にエンコードし、その順序を壊すことはありません。

現時点では不可能と思われるので、これで進めます。

0
Adam Diament