protected internal void ValidateListsBasedOnAttributes(string parent) { var metadata = CfgMetadataCache.GetMetadata(Type); var elementNames = CfgMetadataCache.ElementNames(Type).ToList(); foreach (var listName in elementNames) { var listMetadata = metadata[listName]; var list = (IList)listMetadata.Getter(this); ValidateUniqueAndRequiredProperties(parent, listName, listMetadata, list); } }
void LoadCollections(INode node, string parentName, IDictionary <string, string> parameters, uint sequence) { var metadata = CfgMetadataCache.GetMetadata(Type); var elementNames = CfgMetadataCache.ElementNames(Type).ToList(); var elements = new Dictionary <string, IList>(); var elementHits = new HashSet <string>(); var addHits = new HashSet <string>(); //initialize all the lists for (var i = 0; i < elementNames.Count; i++) { var key = elementNames[i]; elements.Add(key, (IList)metadata[key].Getter(this)); } for (var i = 0; i < node.SubNodes.Count; i++) { var subNode = node.SubNodes[i]; var subNodeKey = CfgMetadataCache.NormalizeName(Type, subNode.Name); if (metadata.ContainsKey(subNodeKey)) { elementHits.Add(subNodeKey); var item = metadata[subNodeKey]; for (var j = 0; j < subNode.SubNodes.Count; j++) { var add = subNode.SubNodes[j]; if (add.Name.Equals("add", StringComparison.Ordinal)) { var addKey = CfgMetadataCache.NormalizeName(Type, subNode.Name); addHits.Add(addKey); if (item.Loader == null) { if (item.ImplementsProperties) { object obj = null; //todo: these activator.createinstances should be cached foreach (var cp in item.Constructors) { if (!cp.Any()) { obj = Activator.CreateInstance(item.ListType); break; } if (cp.Count() == 1) { if (cp.First().ParameterType == typeof(int)) { obj = Activator.CreateInstance(item.ListType, add.Attributes.Count); break; } if (cp.First().ParameterType == typeof(string[])) { var names = add.Attributes.Select(a => a.Name).ToArray(); obj = Activator.CreateInstance(item.ListType, new object[] { names }); break; } } } if (obj == null) { Events.ConstructorNotFound(parentName, subNode.Name); } else { var properties = (IProperties)obj; for (var k = 0; k < add.Attributes.Count; k++) { foreach (var c in Customizers) { c.Customize(string.Empty, add, parameters, Events.Logger); } var attribute = add.Attributes[k]; properties[attribute.Name] = attribute.Value; } elements[addKey].Add(obj); } } } else { elements[addKey].Add(item.Loader().Process(add, subNode.Name, Serializer, Events, parameters, Customizers, ++sequence, Enabled)); } } else { Events.UnexpectedElement(add.Name, subNode.Name); } } } else { Events.InvalidElement(parentName, node.Name, subNode.Name); } } }