bool IDictionaryReferenceManager.IsReferenceProperty(IDictionaryAdapter dictionaryAdapter, string propertyName) { var xmlAdapter = XmlAdapter.For(dictionaryAdapter, false); if (xmlAdapter == null) { return(false); } var instance = dictionaryAdapter.This; PropertyDescriptor property; if (!instance.Properties.TryGetValue(propertyName, out property)) { return(false); } var key = property.GetKey(dictionaryAdapter, propertyName, instance.Descriptor); XmlAccessor accessor; return(xmlAdapter.TryGetAccessor(key, property, false, out accessor) && accessor.IsReference); }
public static bool IsPropertyDefined(string propertyName, IDictionaryAdapter dictionaryAdapter) { var xmlAdapter = XmlAdapter.For(dictionaryAdapter, true); return(xmlAdapter != null && xmlAdapter.HasProperty(propertyName, dictionaryAdapter)); }
public override void SetValue(IXmlNode node, IDictionaryAdapter parent, IXmlAccessor accessor, object oldValue, ref object value) { // Require a dictionary adapter var source = value as IDictionaryAdapter; if (source == null) { throw Error.NotDictionaryAdapter(nameof(value)); } // Detect assignment of own value var sourceAdapter = XmlAdapter.For(source, false); if (sourceAdapter != null && node.PositionEquals(sourceAdapter.Node)) { return; } // Create a fresh component var targetAdapter = new XmlAdapter(node.Save(), XmlAdapter.For(parent).References); if (sourceAdapter != null) { targetAdapter.References.UnionWith(sourceAdapter.References); } var component = (IDictionaryAdapter)parent.CreateChildAdapter(node.ClrType, targetAdapter); // Copy value onto fresh component source.CopyTo(component); value = component; }
public override object GetStub(IXmlNode node, IDictionaryAdapter parent, IXmlAccessor accessor) { // TODO: Refactor var adapter = new XmlAdapter(node, XmlAdapter.For(parent).References); return(parent.CreateChildAdapter(accessor.ClrType, adapter)); }
public override object GetValue( IXmlNode node, IDictionaryAdapter parent, IXmlAccessor accessor ) { var adapter = new XmlAdapter(node.Save(), XmlAdapter.For(parent).References); return(parent.CreateChildAdapter(node.ClrType, adapter)); }
private static void SetNotInGraph(Entry entry, object value) { var xmlAdapter = XmlAdapter.For(value, false); SetNotInGraphCore(entry, value); if (xmlAdapter != null) { SetNotInGraphCore(entry, xmlAdapter); } }
public override object GetValue(IXmlNode node, IDictionaryAdapter parent, IXmlAccessor accessor) { var items = new ArrayList(); var itemType = node.ClrType.GetElementType(); var references = XmlAdapter.For(parent).References; accessor .GetCollectionAccessor(itemType) .GetCollectionItems(node, parent, references, items); return(items.ToArray(itemType)); }
public override void SetValue( IXmlNode node, IDictionaryAdapter parent, IXmlAccessor accessor, object oldValue, ref object value ) { var source = (Array)value; var target = (Array)null; var originals = (Array)oldValue; var itemType = source.GetType().GetElementType(); var subaccessor = accessor.GetCollectionAccessor(itemType); var cursor = subaccessor.SelectCollectionItems(node, true); var serializer = subaccessor.Serializer; var references = XmlAdapter.For(parent).References; for (var i = 0; i < source.Length; i++) { var originalItem = GetItemSafe(originals, i); var providedItem = source.GetValue(i); var assignedItem = providedItem; subaccessor.SetValue( cursor, parent, references, cursor.MoveNext(), originalItem, ref assignedItem ); if (target != null) { target.SetValue(assignedItem, i); } else if (!Equals(assignedItem, providedItem)) { target = Array.CreateInstance(itemType, source.Length); Array.Copy(source, target, i); target.SetValue(assignedItem, i); } } cursor.RemoveAllNext(); if (target != null) { value = target; } }
private void AddValue(Entry entry, Type type, object value, XmlAdapter xmlAdapter) { if (xmlAdapter == null) { xmlAdapter = XmlAdapter.For(value, false); } AddValueCore(entry, type, value, true); if (xmlAdapter != null) { AddValueCore(entry, typeof(XmlAdapter), xmlAdapter, true); } }
public bool OnAssigningValue( IXmlNode node, object oldValue, ref object newValue, out object token ) { if (newValue == oldValue && newValue != null) { token = null; return(false); } var oldEntry = OnReplacingValue(node, oldValue); if (newValue == null) { return(ShouldAssignmentProceed(oldEntry, null, token = null)); } var type = newValue.GetComponentType(); if (ShouldExclude(type)) { return(ShouldAssignmentProceed(oldEntry, null, token = null)); } var xmlAdapter = XmlAdapter.For(newValue, false); Entry newEntry; if (entriesByValue.TryGetValue(xmlAdapter ?? newValue, out newEntry)) { // Value already present in graph; add reference TryGetCompatibleValue(newEntry, type, ref newValue); AddReference(node, newEntry); token = null; } else { // Value not present in graph; add as primary newEntry = oldEntry ?? new Entry(node); AddValue(newEntry, type, newValue, xmlAdapter); format.ClearIdentity(node); format.ClearReference(node); token = newEntry; } return(ShouldAssignmentProceed(oldEntry, newEntry, token)); }
public XmlCollectionAdapter( IXmlNode parentNode, IDictionaryAdapter parentObject, IXmlCollectionAccessor accessor) { items = new List <XmlCollectionItem <T> >(); this.accessor = accessor; this.cursor = accessor.SelectCollectionItems(parentNode, true); this.parentNode = parentNode; this.parentObject = parentObject; this.references = XmlAdapter.For(parentObject).References; while (cursor.MoveNext()) { items.Add(new XmlCollectionItem <T>(cursor.Save())); } }