private static void FixEnumerationSelect(SchemaModel model, DomainStructure namespaces) { // predefined type is defined as a select between two enumerations. We implement selects as interfaces and enumerations // in C# can not implement interfaces var transportElement = model.Get <EntityDefinition>(e => e.Name == "IfcTransportElement").First(); var transportElementType = model.Get <EntityDefinition>(e => e.Name == "IfcTransportElementType").First(); var predefinedType = transportElement.Attributes.First(a => a.Name == "PredefinedType") as ExplicitAttribute; var typePredefinedType = transportElementType.Attributes.First(a => a.Name == "PredefinedType") as ExplicitAttribute; var select = predefinedType.Domain as SelectType; var enums = select.Selections.OfType <EnumerationType>().ToList(); var ns = namespaces.Domains.FirstOrDefault(d => d.Types.Any(t => t == enums[0].Name)); var singleEnum = model.New <EnumerationType>(transportElement.ParentSchema, e => { e.Name = "IfcTransportElementTypeEnum"; e.PersistanceName = e.Name; e.TypeId = model.LastTypeId + 1; e.Elements = new List <ExpressId>( enums.SelectMany(en => en.Elements).Distinct() ); }); predefinedType.Domain = singleEnum; typePredefinedType.Domain = singleEnum; ns.Types.Add(singleEnum.Name); // remove select and enumerations not used model.Remove(select); enums.ForEach(e => model.Remove(e)); }