diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java
index 2a0b97066b4..a3411f68a2a 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java
@@ -470,6 +470,32 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
var.isPrimitiveType = true;
}
}
+ for (CodegenProperty var : model.readWriteVars) {
+ if (enumRefs.containsKey(var.dataType)) {
+ // Handle any enum properties referred to by $ref.
+ // This is different in C# than most other generators, because enums in C# are compiled to integral types,
+ // while enums in many other languages are true objects.
+ CodegenModel refModel = enumRefs.get(var.dataType);
+ var.allowableValues = refModel.allowableValues;
+ var.isEnum = true;
+
+ // We do these after updateCodegenPropertyEnum to avoid generalities that don't mesh with C#.
+ var.isPrimitiveType = true;
+ }
+ }
+ for (CodegenProperty var : model.readOnlyVars) {
+ if (enumRefs.containsKey(var.dataType)) {
+ // Handle any enum properties referred to by $ref.
+ // This is different in C# than most other generators, because enums in C# are compiled to integral types,
+ // while enums in many other languages are true objects.
+ CodegenModel refModel = enumRefs.get(var.dataType);
+ var.allowableValues = refModel.allowableValues;
+ var.isEnum = true;
+
+ // We do these after updateCodegenPropertyEnum to avoid generalities that don't mesh with C#.
+ var.isPrimitiveType = true;
+ }
+ }
// We're looping all models here.
if (model.isEnum) {
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java
index 6c2dcc7a714..a12d712c3ff 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java
@@ -661,6 +661,14 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
postProcessPattern(parameter.pattern, parameter.vendorExtensions);
postProcessEmitDefaultValue(parameter.vendorExtensions);
super.postProcessParameter(parameter);
+
+ if (nullableType.contains(parameter.dataType)) {
+ if (!parameter.required) { //optional
+ parameter.dataType = parameter.dataType + "?";
+ } else {
+ parameter.vendorExtensions.put("x-csharp-value-type", true);
+ }
+ }
}
@Override
@@ -668,6 +676,10 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
postProcessPattern(property.pattern, property.vendorExtensions);
postProcessEmitDefaultValue(property.vendorExtensions);
super.postProcessModelProperty(model, property);
+
+ if (!property.isContainer && (nullableType.contains(property.dataType) || property.isEnum)) {
+ property.vendorExtensions.put("x-csharp-value-type", true);
+ }
}
/*
diff --git a/modules/openapi-generator/src/main/resources/csharp/modelGeneric.mustache b/modules/openapi-generator/src/main/resources/csharp/modelGeneric.mustache
index 6a9be0147f8..65422c10c4d 100644
--- a/modules/openapi-generator/src/main/resources/csharp/modelGeneric.mustache
+++ b/modules/openapi-generator/src/main/resources/csharp/modelGeneric.mustache
@@ -3,7 +3,7 @@
///
[DataContract]
{{#discriminator}}
- [JsonConverter(typeof(JsonSubtypes), "{{{discriminatorName}}}")]{{#children}}
+ [JsonConverter(typeof(JsonSubtypes), "{{#lambda.camelcase_param}}{{{discriminatorName}}}{{/lambda.camelcase_param}}")]{{#children}}
[JsonSubtypes.KnownSubType(typeof({{classname}}), "{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}")]{{/children}}
{{/discriminator}}
{{#generatePropertyChanged}}
@@ -31,7 +31,7 @@
{{#description}}
/// {{description}}
{{/description}}
- [DataMember(Name="{{baseName}}", EmitDefaultValue={{#vendorExtensions.x-emit-default-value}}true{{/vendorExtensions.x-emit-default-value}}{{^vendorExtensions.x-emit-default-value}}{{#isNullable}}true{{/isNullable}}{{^isNullable}}false{{/isNullable}}{{/vendorExtensions.x-emit-default-value}})]
+ [DataMember(Name="{{baseName}}", EmitDefaultValue={{#vendorExtensions.x-emit-default-value}}true{{/vendorExtensions.x-emit-default-value}}{{^vendorExtensions.x-emit-default-value}}{{#isNullable}}true{{/isNullable}}{{^isNullable}}{{#required}}true{{/required}}{{^required}}false{{/required}}{{/isNullable}}{{/vendorExtensions.x-emit-default-value}})]
public {{#complexType}}{{{complexType}}}{{/complexType}}{{^complexType}}{{{datatypeWithEnum}}}{{/complexType}}{{^isContainer}}{{^required}}?{{/required}}{{/isContainer}} {{name}} { get; set; }
{{/isEnum}}
{{/vars}}
@@ -108,7 +108,7 @@ this.{{name}} = {{#lambda.camelcase_param}}{{name}}{{/lambda.camelcase_param}};
/// {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{description}}{{/description}}
/// {{#description}}
/// {{description}}{{/description}}
- [DataMember(Name="{{baseName}}", EmitDefaultValue={{#vendorExtensions.x-emit-default-value}}true{{/vendorExtensions.x-emit-default-value}}{{^vendorExtensions.x-emit-default-value}}{{#isNullable}}true{{/isNullable}}{{^isNullable}}false{{/isNullable}}{{/vendorExtensions.x-emit-default-value}})]{{#isDate}}
+ [DataMember(Name="{{baseName}}", EmitDefaultValue={{#vendorExtensions.x-emit-default-value}}true{{/vendorExtensions.x-emit-default-value}}{{^vendorExtensions.x-emit-default-value}}{{#isNullable}}true{{/isNullable}}{{^isNullable}}{{#required}}true{{/required}}{{^required}}false{{/required}}{{/isNullable}}{{/vendorExtensions.x-emit-default-value}})]{{#isDate}}
[JsonConverter(typeof(OpenAPIDateConverter))]{{/isDate}}
public {{{dataType}}} {{name}} { get; {{#isReadOnly}}private {{/isReadOnly}}set; }
{{/isEnum}}
diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumTest.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumTest.cs
index 595a9233150..eb028bacfb5 100644
--- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumTest.cs
+++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumTest.cs
@@ -159,7 +159,7 @@ namespace Org.OpenAPITools.Model
/// enumInteger.
/// enumNumber.
/// outerEnum.
- public EnumTest(EnumStringEnum? enumString = default(EnumStringEnum?), EnumStringRequiredEnum enumStringRequired = default(EnumStringRequiredEnum), EnumIntegerEnum? enumInteger = default(EnumIntegerEnum?), EnumNumberEnum? enumNumber = default(EnumNumberEnum?), OuterEnum outerEnum = default(OuterEnum))
+ public EnumTest(EnumStringEnum? enumString = default(EnumStringEnum?), EnumStringRequiredEnum enumStringRequired = default(EnumStringRequiredEnum), EnumIntegerEnum? enumInteger = default(EnumIntegerEnum?), EnumNumberEnum? enumNumber = default(EnumNumberEnum?), OuterEnum? outerEnum = default(OuterEnum?))
{
this.EnumStringRequired = enumStringRequired;
this.EnumString = enumString;
diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Model/EnumTest.cs b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Model/EnumTest.cs
index 595a9233150..eb028bacfb5 100644
--- a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Model/EnumTest.cs
+++ b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Model/EnumTest.cs
@@ -159,7 +159,7 @@ namespace Org.OpenAPITools.Model
/// enumInteger.
/// enumNumber.
/// outerEnum.
- public EnumTest(EnumStringEnum? enumString = default(EnumStringEnum?), EnumStringRequiredEnum enumStringRequired = default(EnumStringRequiredEnum), EnumIntegerEnum? enumInteger = default(EnumIntegerEnum?), EnumNumberEnum? enumNumber = default(EnumNumberEnum?), OuterEnum outerEnum = default(OuterEnum))
+ public EnumTest(EnumStringEnum? enumString = default(EnumStringEnum?), EnumStringRequiredEnum enumStringRequired = default(EnumStringRequiredEnum), EnumIntegerEnum? enumInteger = default(EnumIntegerEnum?), EnumNumberEnum? enumNumber = default(EnumNumberEnum?), OuterEnum? outerEnum = default(OuterEnum?))
{
this.EnumStringRequired = enumStringRequired;
this.EnumString = enumString;
diff --git a/samples/client/petstore/csharp/OpenAPIClient/docs/FakeApi.md b/samples/client/petstore/csharp/OpenAPIClient/docs/FakeApi.md
index edffb58d3c7..661c2cba6ab 100644
--- a/samples/client/petstore/csharp/OpenAPIClient/docs/FakeApi.md
+++ b/samples/client/petstore/csharp/OpenAPIClient/docs/FakeApi.md
@@ -97,7 +97,7 @@ No authorization required
## FakeOuterBooleanSerialize
-> bool FakeOuterBooleanSerialize (bool body = null)
+> bool FakeOuterBooleanSerialize (bool? body = null)
@@ -120,7 +120,7 @@ namespace Example
{
Configuration.Default.BasePath = "http://petstore.swagger.io:80/v2";
var apiInstance = new FakeApi(Configuration.Default);
- var body = true; // bool | Input boolean as post body (optional)
+ var body = true; // bool? | Input boolean as post body (optional)
try
{
@@ -143,7 +143,7 @@ namespace Example
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
- **body** | **bool**| Input boolean as post body | [optional]
+ **body** | **bool?**| Input boolean as post body | [optional]
### Return type
@@ -245,7 +245,7 @@ No authorization required
## FakeOuterNumberSerialize
-> decimal FakeOuterNumberSerialize (decimal body = null)
+> decimal FakeOuterNumberSerialize (decimal? body = null)
@@ -268,7 +268,7 @@ namespace Example
{
Configuration.Default.BasePath = "http://petstore.swagger.io:80/v2";
var apiInstance = new FakeApi(Configuration.Default);
- var body = 8.14; // decimal | Input number as post body (optional)
+ var body = 8.14; // decimal? | Input number as post body (optional)
try
{
@@ -291,7 +291,7 @@ namespace Example
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
- **body** | **decimal**| Input number as post body | [optional]
+ **body** | **decimal?**| Input number as post body | [optional]
### Return type
@@ -614,7 +614,7 @@ No authorization required
## TestEndpointParameters
-> void TestEndpointParameters (decimal number, double _double, string patternWithoutDelimiter, byte[] _byte, int integer = null, int int32 = null, long int64 = null, float _float = null, string _string = null, System.IO.Stream binary = null, DateTime date = null, DateTime dateTime = null, string password = null, string callback = null)
+> void TestEndpointParameters (decimal number, double _double, string patternWithoutDelimiter, byte[] _byte, int? integer = null, int? int32 = null, long? int64 = null, float? _float = null, string _string = null, System.IO.Stream binary = null, DateTime? date = null, DateTime? dateTime = null, string password = null, string callback = null)
Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
@@ -645,14 +645,14 @@ namespace Example
var _double = 1.2D; // double | None
var patternWithoutDelimiter = patternWithoutDelimiter_example; // string | None
var _byte = BYTE_ARRAY_DATA_HERE; // byte[] | None
- var integer = 56; // int | None (optional)
- var int32 = 56; // int | None (optional)
- var int64 = 789; // long | None (optional)
- var _float = 3.4F; // float | None (optional)
+ var integer = 56; // int? | None (optional)
+ var int32 = 56; // int? | None (optional)
+ var int64 = 789; // long? | None (optional)
+ var _float = 3.4F; // float? | None (optional)
var _string = _string_example; // string | None (optional)
var binary = BINARY_DATA_HERE; // System.IO.Stream | None (optional)
- var date = 2013-10-20; // DateTime | None (optional)
- var dateTime = 2013-10-20T19:20:30+01:00; // DateTime | None (optional)
+ var date = 2013-10-20; // DateTime? | None (optional)
+ var dateTime = 2013-10-20T19:20:30+01:00; // DateTime? | None (optional)
var password = password_example; // string | None (optional)
var callback = callback_example; // string | None (optional)
@@ -681,14 +681,14 @@ Name | Type | Description | Notes
**_double** | **double**| None |
**patternWithoutDelimiter** | **string**| None |
**_byte** | **byte[]**| None |
- **integer** | **int**| None | [optional]
- **int32** | **int**| None | [optional]
- **int64** | **long**| None | [optional]
- **_float** | **float**| None | [optional]
+ **integer** | **int?**| None | [optional]
+ **int32** | **int?**| None | [optional]
+ **int64** | **long?**| None | [optional]
+ **_float** | **float?**| None | [optional]
**_string** | **string**| None | [optional]
**binary** | **System.IO.Stream**| None | [optional]
- **date** | **DateTime**| None | [optional]
- **dateTime** | **DateTime**| None | [optional]
+ **date** | **DateTime?**| None | [optional]
+ **dateTime** | **DateTime?**| None | [optional]
**password** | **string**| None | [optional]
**callback** | **string**| None | [optional]
@@ -719,7 +719,7 @@ void (empty response body)
## TestEnumParameters
-> void TestEnumParameters (List enumHeaderStringArray = null, string enumHeaderString = null, List enumQueryStringArray = null, string enumQueryString = null, int enumQueryInteger = null, double enumQueryDouble = null, List enumFormStringArray = null, string enumFormString = null)
+> void TestEnumParameters (List enumHeaderStringArray = null, string enumHeaderString = null, List enumQueryStringArray = null, string enumQueryString = null, int? enumQueryInteger = null, double? enumQueryDouble = null, List enumFormStringArray = null, string enumFormString = null)
To test enum parameters
@@ -746,8 +746,8 @@ namespace Example
var enumHeaderString = enumHeaderString_example; // string | Header parameter enum test (string) (optional) (default to -efg)
var enumQueryStringArray = enumQueryStringArray_example; // List | Query parameter enum test (string array) (optional)
var enumQueryString = enumQueryString_example; // string | Query parameter enum test (string) (optional) (default to -efg)
- var enumQueryInteger = 56; // int | Query parameter enum test (double) (optional)
- var enumQueryDouble = 1.2D; // double | Query parameter enum test (double) (optional)
+ var enumQueryInteger = 56; // int? | Query parameter enum test (double) (optional)
+ var enumQueryDouble = 1.2D; // double? | Query parameter enum test (double) (optional)
var enumFormStringArray = new List(); // List | Form parameter enum test (string array) (optional) (default to $)
var enumFormString = enumFormString_example; // string | Form parameter enum test (string) (optional) (default to -efg)
@@ -776,8 +776,8 @@ Name | Type | Description | Notes
**enumHeaderString** | **string**| Header parameter enum test (string) | [optional] [default to -efg]
**enumQueryStringArray** | **List<string>**| Query parameter enum test (string array) | [optional]
**enumQueryString** | **string**| Query parameter enum test (string) | [optional] [default to -efg]
- **enumQueryInteger** | **int**| Query parameter enum test (double) | [optional]
- **enumQueryDouble** | **double**| Query parameter enum test (double) | [optional]
+ **enumQueryInteger** | **int?**| Query parameter enum test (double) | [optional]
+ **enumQueryDouble** | **double?**| Query parameter enum test (double) | [optional]
**enumFormStringArray** | [**List<string>**](string.md)| Form parameter enum test (string array) | [optional] [default to $]
**enumFormString** | **string**| Form parameter enum test (string) | [optional] [default to -efg]
@@ -808,7 +808,7 @@ No authorization required
## TestGroupParameters
-> void TestGroupParameters (int requiredStringGroup, bool requiredBooleanGroup, long requiredInt64Group, int stringGroup = null, bool booleanGroup = null, long int64Group = null)
+> void TestGroupParameters (int requiredStringGroup, bool requiredBooleanGroup, long requiredInt64Group, int? stringGroup = null, bool? booleanGroup = null, long? int64Group = null)
Fake endpoint to test group parameters (optional)
@@ -834,9 +834,9 @@ namespace Example
var requiredStringGroup = 56; // int | Required String in group parameters
var requiredBooleanGroup = true; // bool | Required Boolean in group parameters
var requiredInt64Group = 789; // long | Required Integer in group parameters
- var stringGroup = 56; // int | String in group parameters (optional)
- var booleanGroup = true; // bool | Boolean in group parameters (optional)
- var int64Group = 789; // long | Integer in group parameters (optional)
+ var stringGroup = 56; // int? | String in group parameters (optional)
+ var booleanGroup = true; // bool? | Boolean in group parameters (optional)
+ var int64Group = 789; // long? | Integer in group parameters (optional)
try
{
@@ -862,9 +862,9 @@ Name | Type | Description | Notes
**requiredStringGroup** | **int**| Required String in group parameters |
**requiredBooleanGroup** | **bool**| Required Boolean in group parameters |
**requiredInt64Group** | **long**| Required Integer in group parameters |
- **stringGroup** | **int**| String in group parameters | [optional]
- **booleanGroup** | **bool**| Boolean in group parameters | [optional]
- **int64Group** | **long**| Integer in group parameters | [optional]
+ **stringGroup** | **int?**| String in group parameters | [optional]
+ **booleanGroup** | **bool?**| Boolean in group parameters | [optional]
+ **int64Group** | **long?**| Integer in group parameters | [optional]
### Return type
diff --git a/samples/client/petstore/csharp/OpenAPIClient/src/Org.OpenAPITools/Api/FakeApi.cs b/samples/client/petstore/csharp/OpenAPIClient/src/Org.OpenAPITools/Api/FakeApi.cs
index e7f144292bb..d739d62f0a9 100644
--- a/samples/client/petstore/csharp/OpenAPIClient/src/Org.OpenAPITools/Api/FakeApi.cs
+++ b/samples/client/petstore/csharp/OpenAPIClient/src/Org.OpenAPITools/Api/FakeApi.cs
@@ -54,7 +54,7 @@ namespace Org.OpenAPITools.Api
/// Thrown when fails to make API call
/// Input boolean as post body (optional)
/// bool
- bool FakeOuterBooleanSerialize (bool body = default(bool));
+ bool FakeOuterBooleanSerialize (bool? body = default(bool?));
///
///
@@ -65,7 +65,7 @@ namespace Org.OpenAPITools.Api
/// Thrown when fails to make API call
/// Input boolean as post body (optional)
/// ApiResponse of bool
- ApiResponse FakeOuterBooleanSerializeWithHttpInfo (bool body = default(bool));
+ ApiResponse FakeOuterBooleanSerializeWithHttpInfo (bool? body = default(bool?));
///
///
///
@@ -96,7 +96,7 @@ namespace Org.OpenAPITools.Api
/// Thrown when fails to make API call
/// Input number as post body (optional)
/// decimal
- decimal FakeOuterNumberSerialize (decimal body = default(decimal));
+ decimal FakeOuterNumberSerialize (decimal? body = default(decimal?));
///
///
@@ -107,7 +107,7 @@ namespace Org.OpenAPITools.Api
/// Thrown when fails to make API call
/// Input number as post body (optional)
/// ApiResponse of decimal
- ApiResponse FakeOuterNumberSerializeWithHttpInfo (decimal body = default(decimal));
+ ApiResponse FakeOuterNumberSerializeWithHttpInfo (decimal? body = default(decimal?));
///
///
///
@@ -216,7 +216,7 @@ namespace Org.OpenAPITools.Api
/// None (optional)
/// None (optional)
///
- void TestEndpointParameters (decimal number, double _double, string patternWithoutDelimiter, byte[] _byte, int integer = default(int), int int32 = default(int), long int64 = default(long), float _float = default(float), string _string = default(string), System.IO.Stream binary = default(System.IO.Stream), DateTime date = default(DateTime), DateTime dateTime = default(DateTime), string password = default(string), string callback = default(string));
+ void TestEndpointParameters (decimal number, double _double, string patternWithoutDelimiter, byte[] _byte, int? integer = default(int?), int? int32 = default(int?), long? int64 = default(long?), float? _float = default(float?), string _string = default(string), System.IO.Stream binary = default(System.IO.Stream), DateTime? date = default(DateTime?), DateTime? dateTime = default(DateTime?), string password = default(string), string callback = default(string));
///
/// Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
@@ -240,7 +240,7 @@ namespace Org.OpenAPITools.Api
/// None (optional)
/// None (optional)
/// ApiResponse of Object(void)
- ApiResponse