diff --git a/XmlSchemaClassGenerator.Tests/XmlTests.cs b/XmlSchemaClassGenerator.Tests/XmlTests.cs
index 43162982..0216e8d5 100644
--- a/XmlSchemaClassGenerator.Tests/XmlTests.cs
+++ b/XmlSchemaClassGenerator.Tests/XmlTests.cs
@@ -2578,5 +2578,91 @@ public void TestArrayItemAttribute()
var optionList = applicationType.GetProperty("OptionList");
Assert.Equal("Test_Generation_Namespace.T_OptionList", optionList.PropertyType.FullName);
}
+
+ [Fact]
+ public void CollectionSetterInAttributeGroupInterfaceIsPrivateIfCollectionSetterModeIsPrivate()
+ {
+ const string xsd = @"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+";
+
+ var generator = new Generator
+ {
+ NamespaceProvider = new NamespaceProvider
+ {
+ GenerateNamespace = key => "Test",
+ },
+ GenerateInterfaces = true,
+ CollectionSettersMode = CollectionSettersMode.Private
+ };
+ var contents = ConvertXml(nameof(CollectionSetterInAttributeGroupInterfaceIsPrivateIfCollectionSetterModeIsPrivate), xsd, generator).ToArray();
+ var assembly = Compiler.Compile(nameof(CollectionSetterInAttributeGroupInterfaceIsPrivateIfCollectionSetterModeIsPrivate), contents);
+
+ var interfaceProperty = assembly.GetType("Test.IAttrGroup")?.GetProperty("Attr");
+ var implementerProperty = assembly.GetType("Test.Element")?.GetProperty("Attr");
+ Assert.NotNull(interfaceProperty);
+ Assert.NotNull(implementerProperty);
+
+ var interfaceHasPublicSetter = interfaceProperty.GetSetMethod() != null;
+ var implementerHasPublicSetter = implementerProperty.GetSetMethod() != null;
+ Assert.False(interfaceHasPublicSetter);
+ Assert.False(implementerHasPublicSetter);
+ }
+
+ [Fact]
+ public void CollectionSetterInAttributeGroupInterfaceIsPublicIfCollectionSetterModeIsPublic()
+ {
+ const string xsd = @"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+";
+
+ var generator = new Generator
+ {
+ NamespaceProvider = new NamespaceProvider
+ {
+ GenerateNamespace = key => "Test",
+ },
+ GenerateInterfaces = true,
+ CollectionSettersMode = CollectionSettersMode.Public
+ };
+ var contents = ConvertXml(nameof(CollectionSetterInAttributeGroupInterfaceIsPublicIfCollectionSetterModeIsPublic), xsd, generator).ToArray();
+ var assembly = Compiler.Compile(nameof(CollectionSetterInAttributeGroupInterfaceIsPublicIfCollectionSetterModeIsPublic), contents);
+
+ var interfaceProperty = assembly.GetType("Test.IAttrGroup")?.GetProperty("Attr");
+ var implementerProperty = assembly.GetType("Test.Element")?.GetProperty("Attr");
+ Assert.NotNull(interfaceProperty);
+ Assert.NotNull(implementerProperty);
+
+ var interfaceHasPublicSetter = interfaceProperty.GetSetMethod() != null;
+ var implementerHasPublicSetter = implementerProperty.GetSetMethod() != null;
+ Assert.True(interfaceHasPublicSetter);
+ Assert.True(implementerHasPublicSetter);
+ }
}
}
diff --git a/XmlSchemaClassGenerator/TypeModel.cs b/XmlSchemaClassGenerator/TypeModel.cs
index 3bac6eef..5620a7d4 100644
--- a/XmlSchemaClassGenerator/TypeModel.cs
+++ b/XmlSchemaClassGenerator/TypeModel.cs
@@ -781,6 +781,15 @@ private bool IsList
}
}
+ private bool IsPrivateSetter
+ {
+ get
+ {
+ return Configuration.CollectionSettersMode == CollectionSettersMode.Private
+ && (IsCollection || IsArray || (IsList && IsAttribute));
+ }
+ }
+
private CodeTypeReference TypeReference
{
get
@@ -825,9 +834,9 @@ public void AddInterfaceMembersTo(CodeTypeDeclaration typeDeclaration)
{
CodeTypeMember member;
- var isArray = IsArray;
var propertyType = PropertyType;
var isNullableValueType = IsNullableValueType;
+ var isPrivateSetter = IsPrivateSetter;
var typeReference = TypeReference;
if (isNullableValueType && Configuration.GenerateNullables)
@@ -842,7 +851,7 @@ public void AddInterfaceMembersTo(CodeTypeDeclaration typeDeclaration)
Name = Name,
Type = typeReference,
HasGet = true,
- HasSet = !IsCollection && !isArray
+ HasSet = !isPrivateSetter
};
if (DefaultValue != null && IsNullable)
@@ -872,6 +881,7 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi
var propertyType = PropertyType;
var isNullableValueType = IsNullableValueType;
var isNullableReferenceType = IsNullableReferenceType;
+ var isPrivateSetter = IsPrivateSetter;
var typeReference = TypeReference;
var requiresBackingField = withDataBinding || DefaultValue != null || IsCollection || isArray;
@@ -935,8 +945,6 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi
else
member = new CodeMemberField(typeReference, propertyName);
- var isPrivateSetter = (IsCollection || isArray || (IsList && IsAttribute)) && Configuration.CollectionSettersMode == CollectionSettersMode.Private;
-
if (requiresBackingField)
{
member.Name += GetAccessors(member.Name, backingField.Name,