From fe3d1e9b88f52ca8bff3bef048818eab594c8e7b Mon Sep 17 00:00:00 2001 From: Michael Ganss Date: Thu, 11 Jun 2015 18:58:26 +0200 Subject: [PATCH] Always generate backing field for collections (needed by XmlSerializer in .NET 4.0) See https://connect.microsoft.com/VisualStudio/feedback/details/528310/xmlserializer-fails-to-deserialize-readonly-members-that-are-collections-if-they-have-a-private-setter --- XmlSchemaClassGenerator.Tests/XmlTests.cs | 1 - XmlSchemaClassGenerator/TypeModel.cs | 21 ++++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/XmlSchemaClassGenerator.Tests/XmlTests.cs b/XmlSchemaClassGenerator.Tests/XmlTests.cs index caad02e1..09bffb02 100644 --- a/XmlSchemaClassGenerator.Tests/XmlTests.cs +++ b/XmlSchemaClassGenerator.Tests/XmlTests.cs @@ -45,7 +45,6 @@ private Assembly Compile(string name, string pattern) IntegerDataType = typeof(int), DataAnnotationMode = DataAnnotationMode.Partial, GenerateDesignerCategoryAttribute = false, - EnableDataBinding = true }; var files = Glob.Glob.ExpandNames(pattern); diff --git a/XmlSchemaClassGenerator/TypeModel.cs b/XmlSchemaClassGenerator/TypeModel.cs index bdc203a2..1b4810ba 100644 --- a/XmlSchemaClassGenerator/TypeModel.cs +++ b/XmlSchemaClassGenerator/TypeModel.cs @@ -415,7 +415,20 @@ internal static string GetAccessors(string memberName, string backingFieldName, }}", backingFieldName, memberName, (privateSetter ? "private " : string.Empty)); } } - return string.Format(@" + + if (privateSetter) + { + return string.Format(@" + {{ + get + {{ + return this.{0}; + }} + }}", backingFieldName); + } + else + { + return string.Format(@" {{ get {{ @@ -426,6 +439,7 @@ internal static string GetAccessors(string memberName, string backingFieldName, this.{0} = value; }} }}", backingFieldName, (privateSetter ? "private " : string.Empty)); + } } // ReSharper disable once FunctionComplexityOverflow @@ -445,7 +459,7 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi var typeReference = propertyType.GetReferenceFor(OwningType.Namespace, IsCollection || isArray); var simpleType = propertyType as SimpleModel; - var requiresBackingField = withDataBinding || DefaultValue != null; + var requiresBackingField = withDataBinding || DefaultValue != null || IsCollection || isArray; var backingField = new CodeMemberField(typeReference, OwningType.GetUniqueFieldName(this)) { Attributes = MemberAttributes.Private @@ -635,7 +649,8 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi constructor.Comments.AddRange(DocumentationModel.GetComments(constructorDocs).ToArray()); typeDeclaration.Members.Add(constructor); } - var listReference = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), Name); + var listReference = requiresBackingField ? (CodeExpression)new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), backingField.Name) : + new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), Name); var initTypeReference = propertyType.GetReferenceFor(OwningType.Namespace, true, true); var initExpression = new CodeObjectCreateExpression(initTypeReference); constructor.Statements.Add(new CodeAssignStatement(listReference, initExpression));