private void WriteArray(string name, string ns, object o, Type type)
{
Type elementType = TypeScope.GetArrayElementType(type, null);
string typeName;
string typeNs;
StringBuilder arrayDims = new StringBuilder();
if (!_soap12)
{
while ((elementType.IsArray || typeof(IEnumerable).IsAssignableFrom(elementType)) && GetPrimitiveTypeName(elementType, false) == null)
{
elementType = TypeScope.GetArrayElementType(elementType, null);
arrayDims.Append("[]");
}
}
if (elementType == typeof(object))
{
typeName = Soap.UrType;
typeNs = XmlSchema.Namespace;
}
else
{
TypeEntry entry = GetTypeEntry(elementType);
if (entry != null)
{
typeName = entry.typeName;
typeNs = entry.typeNs;
}
else if (_soap12)
{
XmlQualifiedName qualName = GetPrimitiveTypeName(elementType, false);
if (qualName != null)
{
typeName = qualName.Name;
typeNs = qualName.Namespace;
}
else
{
Type elementBaseType = elementType.GetTypeInfo().BaseType;
while (elementBaseType != null)
{
entry = GetTypeEntry(elementBaseType);
if (entry != null) break;
elementBaseType = elementBaseType.GetTypeInfo().BaseType;
}
if (entry != null)
{
typeName = entry.typeName;
typeNs = entry.typeNs;
}
else
{
typeName = Soap.UrType;
typeNs = XmlSchema.Namespace;
}
}
}
else
{
XmlQualifiedName qualName = GetPrimitiveTypeName(elementType);
typeName = qualName.Name;
typeNs = qualName.Namespace;
}
}
if (arrayDims.Length > 0)
typeName = typeName + arrayDims.ToString();
if (_soap12 && name != null && name.Length > 0)
WriteStartElement(name, ns, null, false);
else
WriteStartElement(Soap.Array, Soap.Encoding, null, true);
WriteId(o, false);
if (type.IsArray)
{
Array a = (Array)o;
int arrayLength = a.Length;
if (_soap12)
{
_w.WriteAttributeString("itemType", Soap12.Encoding, GetQualifiedName(typeName, typeNs));
_w.WriteAttributeString("arraySize", Soap12.Encoding, arrayLength.ToString(CultureInfo.InvariantCulture));
}
else
{
_w.WriteAttributeString("arrayType", Soap.Encoding, GetQualifiedName(typeName, typeNs) + "[" + arrayLength.ToString(CultureInfo.InvariantCulture) + "]");
}
for (int i = 0; i < arrayLength; i++)
{
WritePotentiallyReferencingElement("Item", "", a.GetValue(i), elementType, false, true);
}
}
else
{
#if DEBUG
// use exception in the place of Debug.Assert to avoid throwing asserts from a server process such as aspnet_ewp.exe
if (!typeof(IEnumerable).IsAssignableFrom(type)) throw new InvalidOperationException(SR.Format(SR.XmlInternalErrorDetails, "not array like type " + type.FullName));
#endif
int arrayLength = typeof(ICollection).IsAssignableFrom(type) ? ((ICollection)o).Count : -1;
if (_soap12)
{
_w.WriteAttributeString("itemType", Soap12.Encoding, GetQualifiedName(typeName, typeNs));
if (arrayLength >= 0)
_w.WriteAttributeString("arraySize", Soap12.Encoding, arrayLength.ToString(CultureInfo.InvariantCulture));
}
else
{
string brackets = arrayLength >= 0 ? "[" + arrayLength + "]" : "[]";
_w.WriteAttributeString("arrayType", Soap.Encoding, GetQualifiedName(typeName, typeNs) + brackets);
}
IEnumerator e = ((IEnumerable)o).GetEnumerator();
if (e != null)
{
while (e.MoveNext())
{
WritePotentiallyReferencingElement("Item", "", e.Current, elementType, false, true);
}
}
}
_w.WriteEndElement();
}
protected void WritePotentiallyReferencingElement(string n, string ns, object o)