diff --git a/XmlSchemaClassGenerator/ModelBuilder.cs b/XmlSchemaClassGenerator/ModelBuilder.cs index d0d73b62..c9ec1fce 100644 --- a/XmlSchemaClassGenerator/ModelBuilder.cs +++ b/XmlSchemaClassGenerator/ModelBuilder.cs @@ -624,19 +624,28 @@ private TypeModel CreateTypeModel(Uri source, XmlSchemaComplexType complexType, private TypeModel CreateTypeModel(XmlSchemaSimpleType simpleType, NamespaceModel namespaceModel, XmlQualifiedName qualifiedName, List docs) { var restrictions = new List(); + var allBasesHaveEnums = true; List facets = new(); if (simpleType.Content is XmlSchemaSimpleTypeRestriction typeRestriction) + { facets = typeRestriction.Facets.Cast().ToList(); + } else if (simpleType.Content is XmlSchemaSimpleTypeUnion typeUnion && typeUnion.BaseMemberTypes.All(b => b.Content is XmlSchemaSimpleTypeRestriction r && r.Facets.Count > 0)) - facets = typeUnion.BaseMemberTypes.SelectMany(b => ((XmlSchemaSimpleTypeRestriction)b.Content).Facets.Cast()).ToList(); + { + var baseFacets = typeUnion.BaseMemberTypes.Select(b => ((XmlSchemaSimpleTypeRestriction)b.Content).Facets.Cast()).ToList(); + // if a union has enum restrictions, there must be an enum restriction in all parts of the union + allBasesHaveEnums = baseFacets.All(fs => fs.OfType().Any()); + facets = baseFacets.SelectMany(f => f).ToList(); + } if (facets.Any()) { var enumFacets = facets.OfType().ToList(); // If there are other restrictions mixed into the enumeration values, we'll generate a string to play it safe. - var isEnum = enumFacets.Count > 0 && enumFacets.Count == facets.Count; + var isEnum = enumFacets.Any() && allBasesHaveEnums; + if (isEnum) { // we got an enum