object ReadListElement (XmlTypeMapping typeMap, bool isNullable, object list, bool canCreateInstance)
{
Type listType = typeMap.TypeData.Type;
ListMap listMap = (ListMap)typeMap.ObjectMap;
if (listType.IsArray && ReadNull()) return null;
if (list == null) {
if (canCreateInstance && typeMap.TypeData.HasPublicConstructor) list = CreateList (listType);
else throw CreateReadOnlyCollectionException (typeMap.TypeFullName);
}
if (Reader.IsEmptyElement) {
Reader.Skip();
if (listType.IsArray)
list = ShrinkArray ((Array)list, 0, listType.GetElementType(), false);
return list;
}
int index = 0;
Reader.ReadStartElement();
Reader.MoveToContent();
while (Reader.NodeType != System.Xml.XmlNodeType.EndElement)
{
if (Reader.NodeType == System.Xml.XmlNodeType.Element)
{
XmlTypeMapElementInfo elemInfo = listMap.FindElement (Reader.LocalName, Reader.NamespaceURI);
if (elemInfo != null)
AddListValue (typeMap.TypeData, ref list, index++, ReadObjectElement (elemInfo), false);
else
UnknownNode(null);
}
else
UnknownNode(null);
Reader.MoveToContent();
}
ReadEndElement();
if (listType.IsArray)
list = ShrinkArray ((Array)list, index, listType.GetElementType(), false);
return list;
}