private void WriteFixupMethod(string fixupMethodName, Member[] members, string typeName, bool useReflection, bool typed, string source)
{
Writer.WriteLine();
Writer.Write("void ");
Writer.Write(fixupMethodName);
Writer.WriteLine("(object objFixup) {");
Writer.Indent++;
Writer.WriteLine("Fixup fixup = (Fixup)objFixup;");
WriteLocalDecl(typeName, source, "fixup.Source", useReflection);
Writer.WriteLine("string[] ids = fixup.Ids;");
for (int i = 0; i < members.Length; i++)
{
Member member = members[i];
if (member.MultiRef)
{
string fixupIndex = member.FixupIndex.ToString(CultureInfo.InvariantCulture);
Writer.Write("if (ids[");
Writer.Write(fixupIndex);
Writer.WriteLine("] != null) {");
Writer.Indent++;
string memberSource = /*member.IsList ? source + ".Add(" :*/ member.ArraySource;
string targetSource = "GetTarget(ids[" + fixupIndex + "])";
TypeDesc td = member.Mapping.TypeDesc;
if (td.IsCollection || td.IsEnumerable)
{
WriteAddCollectionFixup(td, member.Mapping.ReadOnly, memberSource, targetSource);
}
else
{
if (typed)
{
Writer.WriteLine("try {");
Writer.Indent++;
WriteSourceBeginTyped(memberSource, member.Mapping.TypeDesc);
}
else
WriteSourceBegin(memberSource);
Writer.Write(targetSource);
WriteSourceEnd(memberSource);
Writer.WriteLine(";");
if (member.Mapping.CheckSpecified == SpecifiedAccessor.ReadWrite && member.CheckSpecifiedSource != null && member.CheckSpecifiedSource.Length > 0)
{
Writer.Write(member.CheckSpecifiedSource);
Writer.WriteLine(" = true;");
}
if (typed)
{
WriteCatchCastException(member.Mapping.TypeDesc, targetSource, "ids[" + fixupIndex + "]");
}
}
Writer.Indent--;
Writer.WriteLine("}");
}
}
Writer.Indent--;
Writer.WriteLine("}");
}