Skip to content

[CSHARP] Optional reusable enums are missing null-conditional operator  #1064

@mhallin79

Description

@mhallin79
Description

Optional reusable enums are missing null-conditional operator whilst an optional enum defined on the model correctly has the null-conditional operator.

Swagger-codegen version

3.0.35

Swagger declaration file content or url

Very simple model where the Title enum is declared directly on the Person model whilst Gender is declared as a reusable enum. Only Name is marked as required so both Title and Gender should be generated as nullable properties on the C# Person class.

openapi: 3.0.0
info:
  version: '1.0'
  title: Test
components:
  schemas:
    person:
      type: object
      required:
        - name
      properties:
        name:
          description: Persons name.
          type: string
        gender:
          $ref: '#/components/schemas/gender'
        title:
          type: string
          enum:
            - Mr
            - Mrs
            - Miss
    gender:
      type: string
      enum:
        - Male
        - Female
Command line used for generation

java -jar swagger-codegen-cli-3.0.35.jar generate -l csharp -i "<path-to-spec>"

Steps to reproduce
  1. Generate the C# files using the command line above
  2. Open the file \src\IO.Swagger\Model\Person.cs
Actual result

Note that the Title enum is generated as nullable property but the Gender enum is not. Additionally the constructor parameters for title is nullable but gender is not.

namespace IO.Swagger.Model
{
        /// <summary>
        /// Initializes a new instance of the <see cref="Person" /> class.
        /// </summary>
        /// <param name="name">Persons name. (required).</param>
        /// <param name="gender">gender.</param>
        /// <param name="title">title.</param>
        public Person(string name = default(string), Gender gender = default(Gender), TitleEnum? title = default(TitleEnum?))
        {
            // to ensure "name" is required (not null)
            if (name == null)
            {
                throw new InvalidDataException("name is a required property for Person and cannot be null");
            }
            else
            {
                this.Name = name;
            }
            this.Gender = gender;
            this.Title = title;
        }
        
        /// <summary>
        /// Persons name.
        /// </summary>
        /// <value>Persons name.</value>
        [DataMember(Name="name", EmitDefaultValue=false)]
        public string Name { get; set; }

        /// <summary>
        /// Gets or Sets Gender
        /// </summary>
        [DataMember(Name="gender", EmitDefaultValue=false)]
        public Gender Gender { get; set; }

        /// Gets or Sets Title
        /// </summary>
        [DataMember(Name="title", EmitDefaultValue=false)]
        public TitleEnum? Title { get; set; }

}
Expected result

See added null-conditional operator ? for the Gender property. Additionally the constructor parameters for gender is now also nullable.

namespace IO.Swagger.Model
{
        /// <summary>
        /// Initializes a new instance of the <see cref="Person" /> class.
        /// </summary>
        /// <param name="name">Persons name. (required).</param>
        /// <param name="gender">gender.</param>
        /// <param name="title">title.</param>
        public Person(string name = default(string), Gender? gender = default(Gender?), TitleEnum? title = default(TitleEnum?))
        {
            // to ensure "name" is required (not null)
            if (name == null)
            {
                throw new InvalidDataException("name is a required property for Person and cannot be null");
            }
            else
            {
                this.Name = name;
            }
            this.Gender = gender;
            this.Title = title;
        }
        
        /// <summary>
        /// Persons name.
        /// </summary>
        /// <value>Persons name.</value>
        [DataMember(Name="name", EmitDefaultValue=false)]
        public string Name { get; set; }

        /// <summary>
        /// Gets or Sets Gender
        /// </summary>
        [DataMember(Name="gender", EmitDefaultValue=false)]
        public Gender? Gender { get; set; }

        /// Gets or Sets Title
        /// </summary>
        [DataMember(Name="title", EmitDefaultValue=false)]
        public TitleEnum? Title { get; set; }

}
Related issues/PRs

swagger-api/swagger-codegen#6851

Suggest a fix/enhancement

Treat reusable nullable enums the same way as enums that are not reusable.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions