From 8cab513a3432dc51b21122ed05abc3f684eee74d Mon Sep 17 00:00:00 2001 From: Josh Weisman Date: Tue, 14 May 2019 04:37:52 +0300 Subject: [PATCH 1/2] Remove duplicate "is" from Boolean getter --- src/main/resources/handlebars/Java/pojo.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/handlebars/Java/pojo.mustache b/src/main/resources/handlebars/Java/pojo.mustache index ca3214e90b..9d3e09fa53 100644 --- a/src/main/resources/handlebars/Java/pojo.mustache +++ b/src/main/resources/handlebars/Java/pojo.mustache @@ -145,7 +145,7 @@ public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#parcela {{#vendorExtensions.extraAnnotation}} {{{vendorExtensions.extraAnnotation}}} {{/vendorExtensions.extraAnnotation}} - public {{{datatypeWithEnum}}} {{#isBoolean}}is{{/isBoolean}}{{getter}}() { + public {{{datatypeWithEnum}}} {{getter}}() { return {{name}}; } {{^isReadOnly}} From a888a7bfcbc252f25d34f2473dc7a3f3f621822b Mon Sep 17 00:00:00 2001 From: frantuma Date: Wed, 15 May 2019 18:29:57 +0200 Subject: [PATCH 2/2] fix csharp client --- .../v3/generators/DefaultCodegenConfig.java | 2 +- .../dotnet/AbstractCSharpCodegen.java | 41 +++++++-- .../handlebars/csharp/CsharpHelper.java | 8 ++ .../handlebars/lambda/CamelCaseLambda.java | 60 ++++++++++++ .../handlebars/lambda/IndentedLambda.java | 91 +++++++++++++++++++ .../handlebars/lambda/LowercaseLambda.java | 46 ++++++++++ .../handlebars/lambda/TitlecaseLambda.java | 70 ++++++++++++++ .../handlebars/lambda/UppercaseLambda.java | 30 ++++++ .../resources/handlebars/csharp/api.mustache | 29 ++++-- .../handlebars/csharp/modelGeneric.mustache | 1 + 10 files changed, 364 insertions(+), 14 deletions(-) create mode 100644 src/main/java/io/swagger/codegen/v3/generators/handlebars/csharp/CsharpHelper.java create mode 100644 src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/CamelCaseLambda.java create mode 100644 src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/IndentedLambda.java create mode 100644 src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/LowercaseLambda.java create mode 100644 src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/TitlecaseLambda.java create mode 100644 src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/UppercaseLambda.java diff --git a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java index c4370ab9bf..365df615e6 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java +++ b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java @@ -1088,7 +1088,7 @@ private static String getTypeOfSchema(Schema schema) { if(SchemaTypeUtil.INTEGER64_FORMAT.equals(schema.getFormat())) { return "long"; } else { - return schema.getType(); + return "integer"; } } else if (schema instanceof MapSchema) { return "map"; diff --git a/src/main/java/io/swagger/codegen/v3/generators/dotnet/AbstractCSharpCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/dotnet/AbstractCSharpCodegen.java index 46d6dbe59c..9b294575dc 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/dotnet/AbstractCSharpCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/dotnet/AbstractCSharpCodegen.java @@ -1,12 +1,19 @@ package io.swagger.codegen.v3.generators.dotnet; +import com.github.jknack.handlebars.Handlebars; +import com.github.jknack.handlebars.Lambda; import com.google.common.collect.ImmutableMap; -import com.samskivert.mustache.Mustache; import io.swagger.codegen.v3.CodegenConstants; import io.swagger.codegen.v3.CodegenModel; import io.swagger.codegen.v3.CodegenOperation; import io.swagger.codegen.v3.CodegenProperty; import io.swagger.codegen.v3.generators.DefaultCodegenConfig; +import io.swagger.codegen.v3.generators.handlebars.csharp.CsharpHelper; +import io.swagger.codegen.v3.generators.handlebars.lambda.CamelCaseLambda; +import io.swagger.codegen.v3.generators.handlebars.lambda.IndentedLambda; +import io.swagger.codegen.v3.generators.handlebars.lambda.LowercaseLambda; +import io.swagger.codegen.v3.generators.handlebars.lambda.TitlecaseLambda; +import io.swagger.codegen.v3.generators.handlebars.lambda.UppercaseLambda; import io.swagger.codegen.v3.utils.ModelUtils; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; @@ -158,10 +165,12 @@ public AbstractCSharpCodegen() { typeMapping.put("bytearray", "byte[]"); typeMapping.put("boolean", "bool?"); typeMapping.put("integer", "int?"); + typeMapping.put("int", "int?"); typeMapping.put("float", "float?"); typeMapping.put("long", "long?"); typeMapping.put("double", "double?"); typeMapping.put("number", "decimal?"); + typeMapping.put("BigDecimal", "decimal?"); typeMapping.put("datetime", "DateTime?"); typeMapping.put("date", "DateTime?"); typeMapping.put("file", "System.IO.Stream"); @@ -328,13 +337,13 @@ public void processOpts() { // This either updates additionalProperties with the above fixes, or sets the default if the option was not specified. additionalProperties.put(CodegenConstants.INTERFACE_PREFIX, interfacePrefix); - //addMustacheLambdas(additionalProperties); + addHandlebarsLambdas(additionalProperties); } - /** todo: write with OAS3 classes. - private void addMustacheLambdas(Map objs) { + private void addHandlebarsLambdas(Map objs) { - Map lambdas = new ImmutableMap.Builder() + + Map lambdas = new ImmutableMap.Builder() .put("lowercase", new LowercaseLambda().generator(this)) .put("uppercase", new UppercaseLambda()) .put("titlecase", new TitlecaseLambda()) @@ -346,6 +355,7 @@ private void addMustacheLambdas(Map objs) { .put("indented_16", new IndentedLambda(16, " ")) .build(); + if (objs.containsKey("lambda")) { LOGGER.warn("An property named 'lambda' already exists. Mustache lambdas renamed from 'lambda' to '_lambda'. " + "You'll likely need to use a custom template, " + @@ -355,7 +365,6 @@ private void addMustacheLambdas(Map objs) { objs.put("lambda", lambdas); } } - */ @Override public void postProcessModelProperty(CodegenModel model, CodegenProperty property) { @@ -494,7 +503,7 @@ public void updateCodegenPropertyEnum(CodegenProperty var) { var.vendorExtensions = new HashMap<>(); } - ModelUtils.updateCodegenPropertyEnum(var); + super.updateCodegenPropertyEnum(var); // Because C# uses nullable primitives for datatype, and datatype is used in DefaultCodegen for determining enum-ness, guard against weirdness here. if (getBooleanValue(var, CodegenConstants.IS_ENUM_EXT_NAME)) { @@ -1029,4 +1038,22 @@ public String escapeUnsafeCharacters(String input) { return intermediate; } + + @Override + public void addHandlebarHelpers(Handlebars handlebars) { + super.addHandlebarHelpers(handlebars); + handlebars.registerHelpers(new CsharpHelper()); + } + +/* + TODO: uncomment if/when switching to stream for file upload + @Override + public void postProcessParameter(CodegenParameter parameter) { + if (parameter.getIsBinary()) { + parameter.dataType = "System.IO.Stream"; + } + super.postProcessParameter(parameter); + } +*/ + } \ No newline at end of file diff --git a/src/main/java/io/swagger/codegen/v3/generators/handlebars/csharp/CsharpHelper.java b/src/main/java/io/swagger/codegen/v3/generators/handlebars/csharp/CsharpHelper.java new file mode 100644 index 0000000000..1ef37965cf --- /dev/null +++ b/src/main/java/io/swagger/codegen/v3/generators/handlebars/csharp/CsharpHelper.java @@ -0,0 +1,8 @@ +package io.swagger.codegen.v3.generators.handlebars.csharp; + +public class CsharpHelper { + + public CharSequence backslash() { + return "\\"; + } +} diff --git a/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/CamelCaseLambda.java b/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/CamelCaseLambda.java new file mode 100644 index 0000000000..b7345626c2 --- /dev/null +++ b/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/CamelCaseLambda.java @@ -0,0 +1,60 @@ +package io.swagger.codegen.v3.generators.handlebars.lambda; + +import com.github.jknack.handlebars.Lambda; +import io.swagger.codegen.v3.CodegenConfig; +import io.swagger.codegen.v3.generators.DefaultCodegenConfig; + +import java.io.IOException; + +/** + * Converts text in a fragment to camelCase. + * + * Register: + *
+ * additionalProperties.put("camelcase", new CamelCaseLambda());
+ * 
+ * + * Use: + *
+ * {{#camelcase}}{{name}}{{/camelcase}}
+ * 
+ */ +public class CamelCaseLambda implements Lambda { + + private CodegenConfig generator = null; + private Boolean escapeParam = false; + + public CamelCaseLambda() { + + } + + public CamelCaseLambda generator(final CodegenConfig generator) { + this.generator = generator; + return this; + } + + public CamelCaseLambda escapeAsParamName(final Boolean escape) { + this.escapeParam = escape; + return this; + } + @Override + public Object apply(Object o, com.github.jknack.handlebars.Template template) throws IOException { + String executed = template.apply(o); + String text = DefaultCodegenConfig.camelize(executed, true); + if (generator != null) { + text = generator.sanitizeName(text); + if (generator.reservedWords().contains(text)) { + // Escaping must be done *after* camelize, because generators may escape using characters removed by camelize function. + text = generator.escapeReservedWord(text); + } + + if (escapeParam) { + // NOTE: many generators call escapeReservedWord in toParamName, but we can't assume that's always the case. + // Here, we'll have to accept that we may be duplicating some work. + text = generator.toParamName(text); + } + } + return text; + } + +} diff --git a/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/IndentedLambda.java b/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/IndentedLambda.java new file mode 100644 index 0000000000..a3261de053 --- /dev/null +++ b/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/IndentedLambda.java @@ -0,0 +1,91 @@ +package io.swagger.codegen.v3.generators.handlebars.lambda; + +import com.github.jknack.handlebars.Lambda; +import org.apache.commons.lang3.StringUtils; + +import java.io.IOException; + +/** + * This naively prepends indention to all lines of a fragment. + *

+ * Generator authors may add helpers for explicitly adding prefixed spaces which fragments won't be aware of. + *

+ * Register: + *

+ * additionalProperties.put("indent4", new IndentedLambda(4));
+ * additionalProperties.put("indent8", new IndentedLambda(8));
+ * 
+ *

+ * Use: + *

{@code
+ *     {{#indent4}}{{>template}}{{/indent4}}
+ *         {{#indent8}}{{>other_template}}{{/indent8}}
+ * }
+ */ +public class IndentedLambda implements Lambda { + private final int prefixSpaceCount; + private int spaceCode; + + /** + * Constructs a new instance of {@link io.swagger.codegen.mustache.IndentedLambda}, with an indent count of 4 spaces + */ + public IndentedLambda() { + this(4, " "); + } + + /** + * Constructs a new instance of {@link io.swagger.codegen.mustache.IndentedLambda}, with customized indent count and intention character + * + * @param prefixSpaceCount The number of indented characters to apply as a prefix to a fragment. + * @param indentionCharacter String representation of the character used in the indent (e.g. " ", "\t", "."). + */ + public IndentedLambda(int prefixSpaceCount, String indentionCharacter) { + this(prefixSpaceCount, Character.codePointAt(indentionCharacter, 0)); + } + + /** + * Constructs a new instance of {@link io.swagger.codegen.mustache.IndentedLambda} + * + * @param prefixSpaceCount The number of indented characters to apply as a prefix to a fragment. + */ + private IndentedLambda(int prefixSpaceCount, int indentionCodePoint) { + if (prefixSpaceCount <= 0) { + throw new IllegalArgumentException("prefixSpaceCount must be greater than 0"); + } + + if (!Character.isValidCodePoint(indentionCodePoint)) { + throw new IllegalArgumentException("indentionCodePoint is an invalid code point "); + } + + this.prefixSpaceCount = prefixSpaceCount; + this.spaceCode = indentionCodePoint; + } + + @Override + public Object apply(Object o, com.github.jknack.handlebars.Template template) throws IOException { + String text = template.apply(o); + if (text == null || text.length() == 0) { + return text; + } + + String prefixedIndention = StringUtils.repeat(new String(Character.toChars(spaceCode)), prefixSpaceCount); + StringBuilder sb = new StringBuilder(); + String[] lines = text.split(System.lineSeparator()); + for (int i = 0; i < lines.length; i++) { + String line = lines[i]; + // Mustache will apply correct indentation to the first line of a template (to match declaration location). + // So, we want to skip the first line. + if (i > 0) { + sb.append(prefixedIndention); + } + + sb.append(line); + + // We've split on the system's line separator. We don't want to add an additional trailing line. + if (i < lines.length - 1) { + sb.append(System.lineSeparator()); + } + } + return sb.toString(); + } +} diff --git a/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/LowercaseLambda.java b/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/LowercaseLambda.java new file mode 100644 index 0000000000..c133dfe684 --- /dev/null +++ b/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/LowercaseLambda.java @@ -0,0 +1,46 @@ +package io.swagger.codegen.v3.generators.handlebars.lambda; + +import com.github.jknack.handlebars.Lambda; +import io.swagger.codegen.v3.CodegenConfig; + +import java.io.IOException; + +/** + * Converts text in a fragment to lowercase. + * + * Register: + *
+ * additionalProperties.put("lowercase", new LowercaseLambda());
+ * 
+ * + * Use: + *
+ * {{#lowercase}}{{httpMethod}}{{/lowercase}}
+ * 
+ */ +public class LowercaseLambda implements Lambda { + private CodegenConfig generator = null; + + public LowercaseLambda() { + + } + + public LowercaseLambda generator(final CodegenConfig generator) { + this.generator = generator; + return this; + } + + @Override + public Object apply(Object o, com.github.jknack.handlebars.Template template) throws IOException { + String text = template.apply(o); + if (text == null || text.length() == 0) { + return text; + } + text = text.toLowerCase(); + if (generator != null && generator.reservedWords().contains(text)) { + text = generator.escapeReservedWord(text); + } + + return text; + } +} diff --git a/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/TitlecaseLambda.java b/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/TitlecaseLambda.java new file mode 100644 index 0000000000..bd9597d898 --- /dev/null +++ b/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/TitlecaseLambda.java @@ -0,0 +1,70 @@ +package io.swagger.codegen.v3.generators.handlebars.lambda; + +import com.github.jknack.handlebars.Lambda; + +import java.io.IOException; + +/** + * Converts text in a fragment to title case. + * + * Register: + *
+ * additionalProperties.put("titlecase", new TitlecaseLambda());
+ * 
+ * + * Use: + *
+ * {{#titlecase}}{{classname}}{{/titlecase}}
+ * 
+ */ +public class TitlecaseLambda implements Lambda { + private String delimiter; + + /** + * Constructs a new instance of {@link io.swagger.codegen.mustache.TitlecaseLambda}, which will convert all text + * in a space delimited string to title-case. + */ + public TitlecaseLambda() { + this(" "); + } + + /** + * Constructs a new instance of {@link io.swagger.codegen.mustache.TitlecaseLambda}, splitting on the specified + * delimiter and converting each word to title-case. + *

+ * NOTE: passing {@code null} results in a title-casing the first word only. + * + * @param delimiter Provided to allow an override for the default space delimiter. + */ + public TitlecaseLambda(String delimiter) { + this.delimiter = delimiter; + } + + private String titleCase(final String input) { + return input.substring(0, 1).toUpperCase() + input.substring(1); + } + + @Override + public Object apply(Object o, com.github.jknack.handlebars.Template template) throws IOException { + String text = template.apply(o); + if (text == null || text.length() == 0) { + return text; + } + if (delimiter == null) { + return titleCase(text); + } + + // Split accepts regex. \Q and \E wrap the delimiter to create a literal regex, + // so things like "." and "|" aren't treated as their regex equivalents. + StringBuffer sb = new StringBuffer(); + String[] parts = text.split("\\Q" + delimiter + "\\E"); + for (int i = 0; i < parts.length; i++) { + String part = parts[i]; + sb.append(titleCase(part)); + if (i != parts.length - 1) { + sb.append(delimiter); + } + } + return sb.toString(); + } +} diff --git a/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/UppercaseLambda.java b/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/UppercaseLambda.java new file mode 100644 index 0000000000..8923f7f009 --- /dev/null +++ b/src/main/java/io/swagger/codegen/v3/generators/handlebars/lambda/UppercaseLambda.java @@ -0,0 +1,30 @@ +package io.swagger.codegen.v3.generators.handlebars.lambda; + +import com.github.jknack.handlebars.Lambda; + +import java.io.IOException; + +/** + * Converts text in a fragment to uppercase. + * + * Register: + *

+ * additionalProperties.put("uppercase", new UppercaseLambda());
+ * 
+ * + * Use: + *
+ * {{#uppercase}}{{summary}}{{/uppercase}}
+ * 
+ */ +public class UppercaseLambda implements Lambda { + + @Override + public Object apply(Object o, com.github.jknack.handlebars.Template template) throws IOException { + String text = template.apply(o); + if (text == null || text.length() == 0) { + return text; + } + return text.toUpperCase(); + } +} diff --git a/src/main/resources/handlebars/csharp/api.mustache b/src/main/resources/handlebars/csharp/api.mustache index 37ebf9834b..970267cba0 100644 --- a/src/main/resources/handlebars/csharp/api.mustache +++ b/src/main/resources/handlebars/csharp/api.mustache @@ -97,6 +97,17 @@ namespace {{packageName}}.{{apiPackage}} ExceptionFactory = {{packageName}}.Client.Configuration.DefaultExceptionFactory; } + /// + /// Initializes a new instance of the class + /// + /// + public {{classname}}() + { + this.Configuration = {{packageName}}.Client.Configuration.Default; + + ExceptionFactory = {{packageName}}.Client.Configuration.DefaultExceptionFactory; + } + /// /// Initializes a new instance of the class /// using Configuration object @@ -241,9 +252,12 @@ namespace {{packageName}}.{{apiPackage}} {{#headerParams}} if ({{paramName}} != null) localVarHeaderParams.Add("{{baseName}}", this.Configuration.ApiClient.ParameterToString({{paramName}})); // header parameter {{/headerParams}} + {{#isForm}} {{#formParams}} if ({{paramName}} != null) {{#isFile}}localVarFileParams.Add("{{baseName}}", this.Configuration.ApiClient.ParameterToFile("{{baseName}}", {{paramName}}));{{/isFile}}{{^isFile}}localVarFormParams.Add("{{baseName}}", this.Configuration.ApiClient.ParameterToString({{paramName}})); // form parameter{{/isFile}} {{/formParams}} + {{/isForm}} + {{^isForm}} {{#bodyParam}} if ({{paramName}} != null && {{paramName}}.GetType() != typeof(byte[])) { @@ -254,7 +268,7 @@ namespace {{packageName}}.{{apiPackage}} localVarPostBody = {{paramName}}; // byte array } {{/bodyParam}} - + {{/isForm}} {{#authMethods}} // authentication ({{name}}) required {{#isApiKey}} @@ -302,12 +316,12 @@ namespace {{packageName}}.{{apiPackage}} {{#returnType}} return new ApiResponse<{{{returnType}}}>(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.{{^netStandard}}Name{{/netStandard}}{{#netStandard}}Key{{/netStandard}}, x => x.Value.ToString()), + localVarResponse.Headers.ToDictionary(x => x.{{^netStandard}}Name{{/netStandard}}{{#netStandard}}Key{{/netStandard}}, x => string.Join(",", x.Value)), ({{{returnType}}}) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof({{#returnContainer}}{{{returnContainer}}}{{/returnContainer}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}))); {{/returnType}} {{^returnType}} return new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.{{^netStandard}}Name{{/netStandard}}{{#netStandard}}Key{{/netStandard}}, x => x.Value.ToString()), + localVarResponse.Headers.ToDictionary(x => x.{{^netStandard}}Name{{/netStandard}}{{#netStandard}}Key{{/netStandard}}, x => string.Join(",", x.Value)), null); {{/returnType}} } @@ -377,9 +391,12 @@ namespace {{packageName}}.{{apiPackage}} {{#headerParams}} if ({{paramName}} != null) localVarHeaderParams.Add("{{baseName}}", this.Configuration.ApiClient.ParameterToString({{paramName}})); // header parameter {{/headerParams}} + {{#isForm}} {{#formParams}} if ({{paramName}} != null) {{#isFile}}localVarFileParams.Add("{{baseName}}", this.Configuration.ApiClient.ParameterToFile("{{baseName}}", {{paramName}}));{{/isFile}}{{^isFile}}localVarFormParams.Add("{{baseName}}", this.Configuration.ApiClient.ParameterToString({{paramName}})); // form parameter{{/isFile}} {{/formParams}} + {{/isForm}} + {{^isForm}} {{#bodyParam}} if ({{paramName}} != null && {{paramName}}.GetType() != typeof(byte[])) { @@ -390,7 +407,7 @@ namespace {{packageName}}.{{apiPackage}} localVarPostBody = {{paramName}}; // byte array } {{/bodyParam}} - + {{/isForm}} {{#authMethods}} // authentication ({{name}}) required {{#isApiKey}} @@ -438,12 +455,12 @@ namespace {{packageName}}.{{apiPackage}} {{#returnType}} return new ApiResponse<{{{returnType}}}>(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.{{^netStandard}}Name{{/netStandard}}{{#netStandard}}Key{{/netStandard}}, x => x.Value.ToString()), + localVarResponse.Headers.ToDictionary(x => x.{{^netStandard}}Name{{/netStandard}}{{#netStandard}}Key{{/netStandard}}, x => string.Join(",", x.Value)), ({{{returnType}}}) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof({{#returnContainer}}{{{returnContainer}}}{{/returnContainer}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}))); {{/returnType}} {{^returnType}} return new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.{{^netStandard}}Name{{/netStandard}}{{#netStandard}}Key{{/netStandard}}, x => x.Value.ToString()), + localVarResponse.Headers.ToDictionary(x => x.{{^netStandard}}Name{{/netStandard}}{{#netStandard}}Key{{/netStandard}}, x => string.Join(",", x.Value)), null); {{/returnType}} } diff --git a/src/main/resources/handlebars/csharp/modelGeneric.mustache b/src/main/resources/handlebars/csharp/modelGeneric.mustache index 81700aeb69..0d98ecaf61 100644 --- a/src/main/resources/handlebars/csharp/modelGeneric.mustache +++ b/src/main/resources/handlebars/csharp/modelGeneric.mustache @@ -167,6 +167,7 @@ this.{{name}} = {{#lambda.camelcase_param}}{{name}}{{/lambda.camelcase_param}}; ( this.{{name}} == input.{{name}} || this.{{name}} != null && + input.{{name}} != null && this.{{name}}.SequenceEqual(input.{{name}}) ){{#hasMore}} && {{/hasMore}}{{/isNotContainer}}{{/vars}}{{^vars}}{{#parent}}base.Equals(input){{/parent}}{{^parent}}false{{/parent}}{{/vars}}; }