Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • O openapi-generator
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 3,476
    • Issues 3,476
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 402
    • Merge requests 402
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • OpenAPI Tools
  • openapi-generator
  • Merge requests
  • !14533

[csharp-netcore] Fixes issue with enum discriminators

  • Review changes

  • Download
  • Email patches
  • Plain diff
Open Administrator requested to merge github/fork/KrzysztofLabus-RDX/feature/csharp-polymorphism into master Jan 26, 2023
  • Overview 0
  • Commits 1
  • Pipelines 1
  • Changes 47

Created by: KrzysztofLabus-RDX

This PR fixes two issues with csharp code generator:

  1. When enum type is used as discriminator property autogenerated constructors of derived types use string representation of discriminators rather concrete enum value.
  2. Polymorphic Json.NET serialization configures JsonSubtypes converter with CLR property name discriminator value rather JSON property name.

Sample Schema

    MyDiscriminatorType:
      type: string
      enum:
        - Abc
        - Def
    MyBaseType:
      type: object
      required:
        - some_discriminator
      properties:
        some_discriminator:
          $ref: '#/components/schemas/MyDiscriminatorType'
      discriminator:
        propertyName: some_discriminator
        mapping:
          # NOTE: These need to match MyDiscriminatorType options above
          Abc: '#/components/schemas/MyAbc'
          Def: '#/components/schemas/MyDef'
    MyAbc:
      allOf:
        - $ref: '#/components/schemas/MyBaseType'
        - type: object
          required:
            - my_abc_prop
          properties:
            my_abc_prop:
              type: string
    MyDef:
      allOf:
        - $ref: '#/components/schemas/MyBaseType'
        - type: object
          required:
            - my_def_prop
          properties:
            my_def_prop:
              type: boolean

Generated Types (simplified)

// all good
public enum MyDiscriminatorType
{
  Abc = 1,
  Def = 2,
}

[JsonConverter(typeof(JsonSubtypes), "SomeDiscriminator")] // some_discriminator expected
[JsonSubtypes.KnownSubType(typeof(MyAbc), "Abc")]
[JsonSubtypes.KnownSubType(typeof(MyDef), "Def")]
[JsonSubtypes.KnownSubType(typeof(MyAbc), "MyAbc")]
[JsonSubtypes.KnownSubType(typeof(MyDef), "MyDef")]
public partial class MyBaseType : IEquatable<MyBaseType>
{
    // all good
    public MyBaseType(MyDiscriminatorType someDiscriminator = default(MyDiscriminatorType))
    {
        // ...
    }
}

[DataContract(Name = "MyAbc")]
[JsonConverter(typeof(JsonSubtypes), "SomeDiscriminator")] // some_discriminator expected
[JsonSubtypes.KnownSubType(typeof(MyAbc), "Abc")]
[JsonSubtypes.KnownSubType(typeof(MyDef), "Def")]
public partial class MyAbc : MyBaseType, IEquatable<MyAbc>
{
    // compile-time error, MyDiscriminatorType someDiscriminator = MyDiscriminatorType.Abc expected
    public MyAbc(string myAbcProp = default(string), MyDiscriminatorType someDiscriminator = "MyAbc") : base(someDiscriminator)
    {
        // ...
    }
}

@mandrean @frankyjuang @shibayan @Blackclaws @lucamazzanti

Assignee
Assign to
Reviewers
Request review from
Time tracking
Source branch: github/fork/KrzysztofLabus-RDX/feature/csharp-polymorphism