private void WriteAddCollectionFixup(TypeDesc typeDesc, bool readOnly, string memberSource, string targetSource)
{
Writer.WriteLine("// get array of the collection items");
bool useReflection = typeDesc.UseReflection;
CreateCollectionInfo create = (CreateCollectionInfo)_createMethods[typeDesc];
if (create == null)
{
string createName = "create" + (++_nextCreateMethodNumber).ToString(CultureInfo.InvariantCulture) + "_" + typeDesc.Name;
create = new CreateCollectionInfo(createName, typeDesc);
_createMethods.Add(typeDesc, create);
}
Writer.Write("if ((object)(");
Writer.Write(memberSource);
Writer.WriteLine(") == null) {");
Writer.Indent++;
if (readOnly)
{
Writer.Write("throw CreateReadOnlyCollectionException(");
WriteQuotedCSharpString(typeDesc.CSharpName);
Writer.WriteLine(");");
}
else
{
Writer.Write(memberSource);
Writer.Write(" = ");
Writer.Write(RaCodeGen.GetStringForCreateInstance(typeDesc.CSharpName, typeDesc.UseReflection, typeDesc.CannotNew, true));
Writer.WriteLine(";");
}
Writer.Indent--;
Writer.WriteLine("}");
Writer.Write("CollectionFixup collectionFixup = new CollectionFixup(");
Writer.Write(memberSource);
Writer.Write(", ");
Writer.Write("new ");
Writer.Write(typeof(XmlSerializationCollectionFixupCallback).FullName);
Writer.Write("(this.");
Writer.Write(create.Name);
Writer.Write("), ");
Writer.Write(targetSource);
Writer.WriteLine(");");
Writer.WriteLine("AddFixup(collectionFixup);");
}