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