private IEnumerable <ANamable> DeserialiseRecursive(XmlReader reader) { List <ANamable> modules = new List <ANamable>(); if (reader.EOF) { return(modules); } while (reader.Read()) { string fullName = $"{reader.NamespaceURI}:{reader.LocalName}"; if (reader.NodeType == XmlNodeType.EndElement) { if (_invisiblesStack.Count > 0 && _invisiblesStack.Peek() == fullName) { _invisiblesStack.Pop(); } else { return(modules); } } if (reader.NodeType == XmlNodeType.Element) { if (Invisibles.Contains(fullName)) { if (!reader.IsEmptyElement) { _invisiblesStack.Push(fullName); } } else { ANamable newModule = ConfiguredModule(reader); if (newModule != null) { modules.Add(newModule); var newMessageModule = newModule as AMessageModule; if (!reader.IsEmptyElement && newMessageModule != null) { IEnumerable <ANamable> children = DeserialiseRecursive(reader); newMessageModule.Upstreams.AddRange(children.ModulesByType <AMessageModule>()); newMessageModule.Config.AddRange(children.ModulesByType <AConfig>()); } } else { throw new UnknownElementException(fullName); } } } } return(modules); }
/// <summary> /// Return an instance of a module configured with the attributes in the /// current node /// </summary> /// <returns>The module.</returns> private ANamable ConfiguredModule(XmlReader reader) { if (reader.NodeType != XmlNodeType.Element) { return(null); } Type imp = FindImplementation(reader.NamespaceURI, reader.LocalName); if (imp == null) { return(null); } ANamable inst = Activator.CreateInstance(imp) as ANamable; if (inst == null) { return(null); } IMeepDeserialisable selfDeserialiser = inst as IMeepDeserialisable; if (selfDeserialiser != null) { selfDeserialiser.ReadXML(reader); } else if (reader.MoveToFirstAttribute()) { var props = imp.GetRuntimeProperties(); do { var prop = props.FirstOrDefault(x => x.Name == reader.LocalName); if (prop != null) { TypeConverter typeConverter = TypeDescriptor.GetConverter(prop.PropertyType); object propValue = typeConverter.ConvertFromString(reader.Value); prop.SetValue(inst, propValue); } } while (reader.MoveToNextAttribute()); reader.MoveToElement(); } return(inst); }
public void AddParent(ANamable parent) { Parent = parent; }