public static void ToSerializeCall(this CodeWriter writer, XmlElementSerialization serialization, CodeWriterDelegate name, CodeWriterDelegate?writerName = null, CodeWriterDelegate?nameHint = null) { writerName ??= w => w.AppendRaw("writer"); switch (serialization) { case XmlArraySerialization array: if (array.Wrapped) { writer.Line($"{writerName}.WriteStartElement({array.Name:L});"); } var itemVariable = new CodeWriterDeclaration("item"); using (writer.Scope($"foreach (var {itemVariable:D} in {name})")) { writer.ToSerializeCall( array.ValueSerialization, w => w.Append($"{itemVariable}"), writerName); } if (array.Wrapped) { writer.Line($"{writerName}.WriteEndElement();"); } break; case XmlDictionarySerialization dictionarySerialization: var pairVariable = new CodeWriterDeclaration("pair"); using (writer.Scope($"foreach (var {pairVariable:D} in {name})")) { writer.ToSerializeCall( dictionarySerialization.ValueSerialization, w => w.Append($"{pairVariable}.Value"), writerName); } break; case XmlObjectSerialization objectSerialization: if (nameHint != null) { writer.Line($"{writerName}.WriteStartElement({nameHint} ?? {objectSerialization.Name:L});"); } else { writer.Line($"{writerName}.WriteStartElement({objectSerialization.Name:L});"); } CodeWriter.CodeWriterScope?CheckPropertyForNull(ObjectTypeProperty objectTypeProperty) { return(objectTypeProperty.Declaration.Type.IsNullable ? writer.Scope($"if ({objectTypeProperty.Declaration.Name} != null)") : default); } foreach (XmlObjectAttributeSerialization property in objectSerialization.Attributes) { using (CheckPropertyForNull(property.Property)) { writer.Line($"{writerName}.WriteStartAttribute({property.Name:L});"); writer.ToSerializeValueCall( w => w.Append($"{property.Property.Declaration.Name}"), writerName, property.ValueSerialization); writer.Line($"{writerName}.WriteEndAttribute();"); } } foreach (XmlObjectElementSerialization property in objectSerialization.Elements) { using (CheckPropertyForNull(property.Property)) { writer.ToSerializeCall( property.ValueSerialization, w => w.Append($"{property.Property.Declaration.Name}")); } } foreach (XmlObjectArraySerialization property in objectSerialization.EmbeddedArrays) { using (CheckPropertyForNull(property.Property)) { writer.ToSerializeCall( property.ArraySerialization, w => w.Append($"{property.Property.Declaration.Name}")); } } writer.Line($"{writerName}.WriteEndElement();"); return;