private void WriteDerivedSerializable(SerializableMapping head, SerializableMapping mapping, string source, bool isWrappedAny)
{
if (mapping == null)
return;
for (SerializableMapping derived = mapping.DerivedMappings; derived != null; derived = derived.NextDerivedMapping)
{
Writer.Write("else if (tser == null");
Writer.Write(" || ");
WriteQNameEqual("tser", derived.XsiType.Name, derived.XsiType.Namespace);
Writer.WriteLine(") {");
Writer.Indent++;
if (derived.Type != null)
{
if (head.Type.IsAssignableFrom(derived.Type))
{
WriteSourceBeginTyped(source, head.TypeDesc);
Writer.Write("ReadSerializable(( ");
Writer.Write(typeof(IXmlSerializable).FullName);
Writer.Write(")");
Writer.Write(RaCodeGen.GetStringForCreateInstance(derived.TypeDesc.CSharpName, derived.TypeDesc.UseReflection, derived.TypeDesc.CannotNew, false));
if (isWrappedAny)
{
Writer.WriteLine(", true");
}
Writer.Write(")");
WriteSourceEnd(source);
Writer.WriteLine(";");
}
else
{
Writer.Write("throw CreateBadDerivationException(");
WriteQuotedCSharpString(derived.XsiType.Name);
Writer.Write(", ");
WriteQuotedCSharpString(derived.XsiType.Namespace);
Writer.Write(", ");
WriteQuotedCSharpString(head.XsiType.Name);
Writer.Write(", ");
WriteQuotedCSharpString(head.XsiType.Namespace);
Writer.Write(", ");
WriteQuotedCSharpString(derived.Type.FullName);
Writer.Write(", ");
WriteQuotedCSharpString(head.Type.FullName);
Writer.WriteLine(");");
}
}
else
{
Writer.WriteLine("// " + "missing real mapping for " + derived.XsiType);
Writer.Write("throw CreateMissingIXmlSerializableType(");
WriteQuotedCSharpString(derived.XsiType.Name);
Writer.Write(", ");
WriteQuotedCSharpString(derived.XsiType.Namespace);
Writer.Write(", ");
WriteQuotedCSharpString(head.Type.FullName);
Writer.WriteLine(");");
}
Writer.Indent--;
Writer.WriteLine("}");
WriteDerivedSerializable(head, derived, source, isWrappedAny);
}
}