public void LoadFromXml(XmlDocument document) { XmlNodeList nodes = document.SelectNodes(string.Format("/Repositories/Repository/Items/{0}", ContentsType.Name)); foreach (XmlNode node in nodes) { T item = Create(); PropertyInfo[] pi = ContentsType.GetProperties(); foreach (XmlNode propName in node.ChildNodes) { PropertyInfo p = pi.FirstOrDefault(x => x.Name == propName.Name); if (p != null) { string refType = propName.AttributeValueOrDefault("From"); if (string.IsNullOrEmpty(refType)) { object value; if (p.PropertyType.IsEnum) { value = Enum.Parse(p.PropertyType, propName.InnerText); } else { value = Convert.ChangeType(propName.InnerText, p.PropertyType); } p.SetValue(item, value, null); } else { IPropertyRepository repo = owner.Get(refType); Entity e = repo.Objects.OfType <Entity>().FirstOrDefault(x => x.Key() == propName.InnerText); p.SetValue(item, e, null); } } } Add(item); } }
/// <summary> /// Метод вызывается при удалении объекта из какой-либо коллекции и предназначен /// обновления зависимых объектов (объектов помеченых атрибутом DependenceAttribute). /// </summary> /// <param name="removingItem">Удаляемый объект.</param> void RemoveDependence(Entity removingItem) { IDictionary <PropertyInfo, DependenceAttribute> properties = ContentsType.GetProperties <DependenceAttribute>(); if (properties.Count == 0) { return; } foreach (T item in ItemsWithoutFilters) { foreach (PropertyInfo p in properties.Keys) { object propValue = p.GetValue(item, null); if (propValue == null) { continue; } if (propValue.GetType().GetInterface("IList") != null) { IList list = (IList)propValue; Stack stack = new Stack(); foreach (object obj in list) { if (ReferenceEquals(obj, removingItem)) { if (properties[p].Action == DependenceAction.Nothing) { throw new RepositoryException(string.Format(Strings.DeleteEntityError, removingItem.ToString(), item.ToString()), RepoErrors.EntityDependenceError, removingItem); } else { stack.Push(obj); } } else { Entity entity = obj as Entity; if (entity != null) { if (entity.ContainsObject(removingItem)) { if (properties[p].Action == DependenceAction.Nothing) { throw new RepositoryException(string.Format(Strings.DeleteEntityError, removingItem.ToString(), item.ToString()), RepoErrors.EntityDependenceError, removingItem); } else { stack.Push(obj); } } } } } if (stack.Count > 0) { while (stack.Count > 0) { list.Remove(stack.Pop()); } UpdateObjectInternal(item, ObjectAction.Modify); } } else { if (ReferenceEquals(propValue, removingItem)) { switch (properties[p].Action) { case DependenceAction.SetNull: p.SetValue(item, null, null); owner.Get <T>().Update(item); break; case DependenceAction.Delete: owner.Get <T>().Remove(item); break; case DependenceAction.Nothing: throw new RepositoryException(string.Format(Strings.DeleteEntityError, removingItem.ToString(), item.ToString()), RepoErrors.EntityDependenceError, removingItem); default: throw new Exception("Invalid value for DependenceAction"); } } } } } }