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); }
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); }
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); }