Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
            }
        }
Exemple #4
0
		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);
			}
		}
Exemple #5
0
		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;
		}
Exemple #6
0
        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);
        }