private void SetArrayMappingType(ArrayMapping mapping, string defaultNs, Type type)
{
XmlAttributes a = GetAttributes(type, false);
bool isAnonymous = IsAnonymousType(a, defaultNs);
if (isAnonymous)
{
mapping.TypeName = null;
mapping.Namespace = defaultNs;
return;
}
string name;
string ns;
TypeMapping itemTypeMapping;
ElementAccessor element = null;
if (mapping.Elements.Length == 1)
{
element = mapping.Elements[0];
itemTypeMapping = element.Mapping;
}
else
{
itemTypeMapping = null;
}
bool generateTypeName = true;
if (a.XmlType != null)
{
ns = a.XmlType.Namespace;
name = XsdTypeName(type, a, a.XmlType.TypeName);
name = XmlConvert.EncodeLocalName(name);
generateTypeName = name == null;
}
else if (itemTypeMapping is EnumMapping)
{
ns = itemTypeMapping.Namespace;
name = itemTypeMapping.DefaultElementName;
}
else if (itemTypeMapping is PrimitiveMapping)
{
ns = defaultNs;
name = itemTypeMapping.TypeDesc.DataType.Name;
}
else if (itemTypeMapping is StructMapping && itemTypeMapping.TypeDesc.IsRoot)
{
ns = defaultNs;
name = Soap.UrType;
}
else if (itemTypeMapping != null)
{
ns = itemTypeMapping.Namespace == XmlSchema.Namespace ? defaultNs : itemTypeMapping.Namespace;
name = itemTypeMapping.DefaultElementName;
}
else
{
ns = defaultNs;
name = "Choice" + (_choiceNum++);
}
if (name == null)
name = "Any";
if (element != null)
ns = element.Namespace;
if (ns == null)
ns = defaultNs;
string uniqueName = name = generateTypeName ? "ArrayOf" + CodeIdentifier.MakePascal(name) : name;
int i = 1;
TypeMapping existingMapping = (TypeMapping)_types[uniqueName, ns];
while (existingMapping != null)
{
if (existingMapping is ArrayMapping)
{
ArrayMapping arrayMapping = (ArrayMapping)existingMapping;
if (AccessorMapping.ElementsMatch(arrayMapping.Elements, mapping.Elements))
{
break;
}
}
// need to re-name the mapping
uniqueName = name + i.ToString(CultureInfo.InvariantCulture);
existingMapping = (TypeMapping)_types[uniqueName, ns];
i++;
}
mapping.TypeName = uniqueName;
mapping.Namespace = ns;
}