void EmitTryRead_GenSwitch(SerializerCodeGen g, Local fieldNumber, MetaType metaType, SubType[] subTypes, Action <MetaType> returnGen) { using (g.ctx.StartDebugBlockAuto(this)) { if (subTypes.Length == 0) { returnGen(metaType); return; } // may be optimized to check -1 g.ctx.MarkDebug("// Start of switch"); g.Switch(fieldNumber); { foreach (var subType in subTypes) { g.ctx.MarkDebug("// Switch case"); g.Case(subType.FieldNumber); returnGen(subType.DerivedType); g.ctx.MarkDebug("// Switch case - break"); g.Break(); } g.ctx.MarkDebug("// Default switch case"); g.DefaultCase(); returnGen(metaType); g.ctx.MarkDebug("// Default switch case - break"); g.Break(); } g.ctx.MarkDebug("// End of switch"); g.End(); } }