示例#1
0
        private object ReadArray(XPathResult result, IDictionaryAdapter dictionaryAdapter)
        {
            var itemType = result.Type.GetElementType();
            var items    = result.GetNodes(itemType, type => dictionaryAdapter.GetXmlMeta(type))
                           .Select(node => ReadProperty(node, false, dictionaryAdapter)).ToArray();
            var array = Array.CreateInstance(itemType, items.Length);

            items.CopyTo(array, 0);
            return(array);
        }
示例#2
0
        private object ReadArray(XPathResult result, IDictionaryAdapter dictionaryAdapter)
        {
            if (result.Type == typeof(byte[]))
            {
                XPathNavigator node;
                if (result.GetNavigator(false, true, out node) && node != null)
                {
                    return(Convert.FromBase64String(node.InnerXml));
                }
                return(null);
            }
            var itemType  = result.Type.GetElementType();
            var itemNodes = result.GetNodes(itemType, type => dictionaryAdapter.GetXmlMeta(type));

            if (itemNodes == null)
            {
                return(null);
            }
            var items = itemNodes.Select(node => ReadProperty(node, false, dictionaryAdapter)).ToArray();
            var array = Array.CreateInstance(itemType, items.Length);

            items.CopyTo(array, 0);
            return(array);
        }
示例#3
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));
                };

                Action <int, object> addAt = (index, item) =>
                {
                    var node = result.CreateNode(itemType, item, getXmlMeta);
                    WriteProperty(node, item, dictionaryAdapter);
                };

                Action <int, object> setAt = (index, item) =>
                {
                    var node = result.GetNodeAt(itemType, index);
                    WriteProperty(node, item, dictionaryAdapter);
                };

                Action <int> removeAt = index => result.RemoveAt(index);

                var initializer = (IValueInitializer)Activator.CreateInstance(
                    initializerType, addAt, addNew, setAt, removeAt);
                initializer.Initialize(dictionaryAdapter, list);
            }

            return(list);
        }