Example #1
0
        /// <summary>
        /// Generate a choice structure for all child classes of <paramref name="property"/>
        /// </summary>
        private List<XmlSchemaElement> CreateChoice(Property property, Class cls, List<TypeReference> genericParameters, string prefix, List<string> includedModels, List<TypeReference> additionalCompileTargets)
        {
            List<XmlSchemaElement> retVal = new List<XmlSchemaElement>();

            // Iterate through the child classes
            foreach (TypeReference tr in cls.SpecializedBy)
            {
                if (tr.Class == null) continue; // Not interested in non-implementable classes!
                else if (tr.Class.IsAbstract && tr.Class.SpecializedBy.Count > 0) retVal.AddRange(CreateChoice(property, tr.Class, genericParameters, prefix, includedModels, additionalCompileTargets));

                // Clone the property and set the type reference to what we really want to set it up as
                Property choiceProperty = property.Clone() as Property;
                choiceProperty.MemberOf = property.MemberOf;
                choiceProperty.Type = tr;

                // Generate a choice element for this option
                XmlSchemaElement element = CreateElement(choiceProperty, genericParameters, prefix, includedModels, additionalCompileTargets);
                // Find the correct name for this element
                if (element.Name == property.Name && property.AlternateTraversalNames != null && property.AlternateTraversalNames.Count > 0)
                {
                    MohawkCollege.EHR.gpmr.COR.Property.AlternateTraversalData name = property.AlternateTraversalNames.Find(o => o.CaseWhen.Name == tr.Name &&
                                                                                       (o.InteractionOwner.Name == prefix || prefix == null));
                    if (name.TraversalName != null) element.Name = name.TraversalName;
                }
                else
                    element.Name = tr.Class.Name; 

                retVal.Add(element);
            }

            return retVal;
        }