private void WriteEnumAndArrayTypes()
{
foreach (TypeScope scope in Scopes)
{
foreach (Mapping m in scope.TypeMappings)
{
if (m.IsSoap)
continue;
if (m is EnumMapping)
{
EnumMapping mapping = (EnumMapping)m;
Writer.Write("else if (");
WriteQNameEqual("xsiType", mapping.TypeName, mapping.Namespace);
Writer.WriteLine(") {");
Writer.Indent++;
Writer.WriteLine("Reader.ReadStartElement();");
string methodName = ReferenceMapping(mapping);
#if DEBUG
// use exception in the place of Debug.Assert to avoid throwing asserts from a server process such as aspnet_ewp.exe
if (methodName == null) throw new InvalidOperationException(SR.Format(SR.XmlInternalErrorMethod, mapping.TypeDesc.Name));
#endif
Writer.Write("object e = ");
Writer.Write(methodName);
Writer.WriteLine("(CollapseWhitespace(Reader.ReadString()));");
Writer.WriteLine("ReadEndElement();");
Writer.WriteLine("return e;");
Writer.Indent--;
Writer.WriteLine("}");
}
else if (m is ArrayMapping)
{
ArrayMapping mapping = (ArrayMapping)m;
if (mapping.TypeDesc.HasDefaultConstructor)
{
Writer.Write("else if (");
WriteQNameEqual("xsiType", mapping.TypeName, mapping.Namespace);
Writer.WriteLine(") {");
Writer.Indent++;
MemberMapping memberMapping = new MemberMapping();
memberMapping.TypeDesc = mapping.TypeDesc;
memberMapping.Elements = mapping.Elements;
Member member = new Member(this, "a", "z", 0, memberMapping);
TypeDesc td = mapping.TypeDesc;
string fullTypeName = mapping.TypeDesc.CSharpName;
if (td.UseReflection)
{
if (td.IsArray)
Writer.Write(typeof(Array).FullName);
else
Writer.Write("object");
}
else
Writer.Write(fullTypeName);
Writer.Write(" a = ");
if (mapping.TypeDesc.IsValueType)
{
Writer.Write(RaCodeGen.GetStringForCreateInstance(fullTypeName, td.UseReflection, false, false));
Writer.WriteLine(";");
}
else
Writer.WriteLine("null;");
WriteArray(member.Source, member.ArrayName, mapping, false, false, -1);
Writer.WriteLine("return a;");
Writer.Indent--;
Writer.WriteLine("}");
}
}
}
}
}