private void HandleListChanged(object value, ListChangedEventArgs args, IDictionaryAdapter dictionaryAdapter, PropertyDescriptor property) { var change = args.ListChangedType; var changed = change == ListChangedType.ItemAdded || change == ListChangedType.ItemDeleted || change == ListChangedType.ItemMoved || change == ListChangedType.Reset; if (changed && dictionaryAdapter.ShouldClearProperty(property, value)) { value = null; dictionaryAdapter.SetProperty(property.PropertyName, ref value); } }
bool IDictionaryPropertySetter.SetPropertyValue(IDictionaryAdapter dictionaryAdapter, string key, ref object value, PropertyDescriptor property) { XmlAccessor accessor; if (TryGetAccessor(key, property, false, out accessor)) { if (value != null && dictionaryAdapter.ShouldClearProperty(property, value)) { value = null; } var oldValue = dictionaryAdapter.ReadProperty(key); accessor.SetPropertyValue(node, dictionaryAdapter, references, oldValue, ref value); } return(true); }
private void WriteProperty(XPathResult result, object value, IDictionaryAdapter dictionaryAdapter) { var propertyType = result.Type; var shouldRemove = (value == null); if (result.Property != null) { shouldRemove |= dictionaryAdapter.ShouldClearProperty(result.Property, value); dictionaryAdapter.This.ExtendedProperties.Remove(result.Property.PropertyName); } if (shouldRemove) { result.Remove(true); return; } if (WriteCustom(result, value, dictionaryAdapter)) { return; } if (propertyType == typeof(string)) { WriteSimple(result, value, dictionaryAdapter); } else if (typeof(IXPathNavigable).IsAssignableFrom(propertyType)) { WriteFragment(result, (IXPathNavigable)value); } else if (propertyType.IsArray || typeof(IEnumerable).IsAssignableFrom(propertyType)) { WriteCollection(result, value, dictionaryAdapter); } else if (propertyType.IsInterface) { WriteComponent(result, value, dictionaryAdapter); } else { WriteSimple(result, value, dictionaryAdapter); } }
private void WriteProperty(XPathResult result, ref object value, IDictionaryAdapter dictionaryAdapter) { var propertyType = result.Type; var shouldRemove = (value == null); if (result.Property != null) { shouldRemove = shouldRemove || dictionaryAdapter.ShouldClearProperty(result.Property, value); } if (shouldRemove) { result.Remove(true); value = null; return; } if (WriteCustom(result, value, dictionaryAdapter)) { return; } if (propertyType == typeof(string)) { WriteSimple(result, value, dictionaryAdapter); } else if (typeof(IXPathNavigable).IsAssignableFrom(propertyType)) { WriteFragment(result, (IXPathNavigable)value); } else if (propertyType.IsArray || typeof(IEnumerable).IsAssignableFrom(propertyType)) { WriteCollection(result, ref value, dictionaryAdapter); } else if (propertyType.IsInterface) { WriteComponent(result, ref value, dictionaryAdapter); } else { WriteSimple(result, value, dictionaryAdapter); } }
private object ReadList(XPathResult result, IDictionaryAdapter dictionaryAdapter) { Type listType = null, initializerType = null; var arguments = result.Type.GetGenericArguments(); var genericDef = result.Type.GetGenericTypeDefinition(); var itemType = arguments[0]; Func<Type, XmlMetadata> getXmlMeta = type => dictionaryAdapter.GetXmlMeta(type); var itemNodes = result.GetNodes(itemType, getXmlMeta); if (itemNodes == null) return null; if (genericDef == typeof(IEnumerable<>) || genericDef == typeof(ICollection<>) || genericDef == typeof(List<>)) { listType = typeof(EditableList<>).MakeGenericType(arguments); } else if ( #if !DOTNET35 //NOTE: what about SortedSet? genericDef == typeof(ISet<>) || #endif genericDef == typeof(HashSet<>)) { listType = typeof(List<>).MakeGenericType(arguments); } else { listType = typeof(EditableBindingList<>).MakeGenericType(arguments); initializerType = typeof(BindingListInitializer<>).MakeGenericType(arguments); } var list = (IList)Activator.CreateInstance(listType); foreach (var item in itemNodes) { list.Add(ReadProperty(item, false, dictionaryAdapter)); } if ( #if !DOTNET35 //NOTE: what about SortedSet? genericDef == typeof(ISet<>) || #endif genericDef == typeof(HashSet<>)) { return Activator.CreateInstance(typeof(HashSet<>).MakeGenericType(arguments), list); } if (initializerType != null) { Func<object> addNew = () => { var node = result.CreateNode(itemType, null, getXmlMeta); return ReadProperty(node, false, dictionaryAdapter); }; Func<int, object, object> addAt = (index, item) => { var node = result.CreateNode(itemType, item, getXmlMeta); WriteProperty(node, ref item, dictionaryAdapter); return item; }; Func<int, object, object> setAt = (index, item) => { var node = result.GetNodeAt(itemType, index); WriteProperty(node, ref item, dictionaryAdapter); return item; }; Action<int> removeAt = index => { object value = list; if (dictionaryAdapter.ShouldClearProperty(result.Property, value)) { result.Remove(true); return; } result.RemoveAt(index); }; Action reset = () => { object value = list; if (dictionaryAdapter.ShouldClearProperty(result.Property, value)) { result.Remove(true); return; } WriteCollection(result, ref value, dictionaryAdapter); }; var initializer = (IValueInitializer)Activator.CreateInstance( initializerType, addAt, addNew, setAt, removeAt, reset); initializer.Initialize(dictionaryAdapter, list); } return list; }
private object ReadList(XPathResult result, IDictionaryAdapter dictionaryAdapter) { Type listType = null, initializerType = null; var arguments = result.Type.GetGenericArguments(); var genericDef = result.Type.GetGenericTypeDefinition(); var itemType = arguments[0]; Func <Type, XmlMetadata> getXmlMeta = type => dictionaryAdapter.GetXmlMeta(type); var itemNodes = result.GetNodes(itemType, getXmlMeta); if (itemNodes == null) { return(null); } if (genericDef == typeof(IEnumerable <>) || genericDef == typeof(ICollection <>) || genericDef == typeof(List <>)) { listType = typeof(EditableList <>).MakeGenericType(arguments); } else if ( #if !DOTNET35 //NOTE: what about SortedSet? genericDef == typeof(ISet <>) || #endif genericDef == typeof(HashSet <>)) { listType = typeof(List <>).MakeGenericType(arguments); } else { listType = typeof(EditableBindingList <>).MakeGenericType(arguments); initializerType = typeof(BindingListInitializer <>).MakeGenericType(arguments); } var list = (IList)Activator.CreateInstance(listType); foreach (var item in itemNodes) { list.Add(ReadProperty(item, false, dictionaryAdapter)); } if ( #if !DOTNET35 //NOTE: what about SortedSet? genericDef == typeof(ISet <>) || #endif genericDef == typeof(HashSet <>)) { return(Activator.CreateInstance(typeof(HashSet <>).MakeGenericType(arguments), list)); } if (initializerType != null) { Func <object> addNew = () => { var node = result.CreateNode(itemType, null, getXmlMeta); return(ReadProperty(node, false, dictionaryAdapter)); }; Func <int, object, object> addAt = (index, item) => { var node = result.CreateNode(itemType, item, getXmlMeta); WriteProperty(node, ref item, dictionaryAdapter); return(item); }; Func <int, object, object> setAt = (index, item) => { var node = result.GetNodeAt(itemType, index); WriteProperty(node, ref item, dictionaryAdapter); return(item); }; Action <int> removeAt = index => { object value = list; if (dictionaryAdapter.ShouldClearProperty(result.Property, value)) { result.Remove(true); return; } result.RemoveAt(index); }; Action reset = () => { object value = list; if (dictionaryAdapter.ShouldClearProperty(result.Property, value)) { result.Remove(true); return; } WriteCollection(result, ref value, dictionaryAdapter); }; var initializer = (IValueInitializer)Activator.CreateInstance( initializerType, addAt, addNew, setAt, removeAt, reset); initializer.Initialize(dictionaryAdapter, list); } return(list); }