From 44280f5f4e6bb6fc68309172795ba730de3cfadc Mon Sep 17 00:00:00 2001 From: Nickolay Batov Date: Sat, 28 Aug 2021 01:36:39 +0300 Subject: [PATCH] #282 fix NullReferenceException for null public arrays --- XmlSchemaClassGenerator.Tests/XmlTests.cs | 40 +++++++++++++++++++++++ XmlSchemaClassGenerator/TypeModel.cs | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/XmlSchemaClassGenerator.Tests/XmlTests.cs b/XmlSchemaClassGenerator.Tests/XmlTests.cs index 7c865b14..9751e25b 100644 --- a/XmlSchemaClassGenerator.Tests/XmlTests.cs +++ b/XmlSchemaClassGenerator.Tests/XmlTests.cs @@ -2208,6 +2208,46 @@ public void TestArrayOfMsTypeGeneration() //Assert.NotEmpty((System.Collections.IEnumerable)deserialized.D); //<== oops } + [Fact] + public void TestArrayOfStringsWhenPublicAndNull() + { + // see https://github.com/mganss/XmlSchemaClassGenerator/issues/282 + + // arrange + var xsd = + @" + + + + + + + "; + var validXml = + @" + + "; + var generator = new Generator + { + IntegerDataType = typeof(int), + NamespacePrefix = "Test_NS1", + GenerateNullables = true, + CollectionType = typeof(System.Array), + CollectionSettersMode = CollectionSettersMode.Public + }; + var contents = ConvertXml(nameof(TestArrayOfStringsWhenPublicAndNull), new[] { xsd }, generator).ToArray(); + var assembly = Compiler.Compile(nameof(TestForceIsNullableGeneration), contents); + var testType = assembly.GetType("Test_NS1.ArrayOfstring"); + Assert.NotNull(testType); + var serializer = new XmlSerializer(testType); + + // act + dynamic deserialized = serializer.Deserialize(new StringReader(validXml)); + + // assert + var xml = Serialize(serializer, deserialized); + } + [Fact, TestPriority(1)] public void AirspaceServicesTest1() { diff --git a/XmlSchemaClassGenerator/TypeModel.cs b/XmlSchemaClassGenerator/TypeModel.cs index e355decf..b4307cf1 100644 --- a/XmlSchemaClassGenerator/TypeModel.cs +++ b/XmlSchemaClassGenerator/TypeModel.cs @@ -1076,7 +1076,7 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi var countProperty = collectionType == typeof(System.Array) ? "Length" : "Count"; var countReference = new CodePropertyReferenceExpression(listReference, countProperty); var notZeroExpression = new CodeBinaryOperatorExpression(countReference, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(0)); - if (Configuration.CollectionSettersMode == CollectionSettersMode.PublicWithoutConstructorInitialization) + if (Configuration.CollectionSettersMode is CollectionSettersMode.PublicWithoutConstructorInitialization or CollectionSettersMode.Public) { var notNullExpression = new CodeBinaryOperatorExpression(listReference, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(null)); notZeroExpression = new CodeBinaryOperatorExpression(notNullExpression, CodeBinaryOperatorType.BooleanAnd, notZeroExpression);