private static void WriteValue(IScope scope, IWriter writer, IPropertyDef property, XName name, object value) { if (value == null) { return; } if (value is Enum && WriteStringElement(scope, writer, property, name, value)) { return; } if (value.IsPrimitive()) { if (property.Type == typeof(object)) { writer.WriteObjectElement(name, value); } else { writer.WritePrimitiveElement(name, value); } return; } if (WriteStringElement(scope, writer, property, name, value)) { return; } var type = value.GetType(); var xmlWriter = writer as XmlWriterImpl; if (xmlWriter != null) { var surrogate = scope.GetSurrogate(type); if (surrogate != null) { surrogate.Write(xmlWriter.XmlWriter, value); return; } } var elementDef = scope.GetElementDef(type); if (elementDef != null) { var subScope = elementDef as IScope; WriteElement(subScope, writer, value, elementDef, elementDef.Name); return; } var collection = value as IEnumerable; if (collection != null) { var itemDef = new CollectionItemDef(property.ItemName, Reflector.GetItemType(type)); var empty = true; foreach (var item in collection) { if (empty) { writer.WriteStartCollection(name); empty = false; } if (item == null) { writer.WriteNullItem(property.ItemName); continue; } WriteValue(scope, writer, itemDef, property.ItemName, item); } if (!empty) { writer.WriteEndCollection(); } return; } throw new InvalidOperationException(string.Format("Unknown element. Name: {0}. Type: {1}.", name, type)); }
private static void WriteValue(IScope scope, IWriter writer, IPropertyDef property, XName name, object value) { if (value == null) return; if (value is Enum && WriteStringElement(scope, writer, property, name, value)) return; if (value.IsPrimitive()) { if (property.Type == typeof(object)) { writer.WriteObjectElement(name, value); } else { writer.WritePrimitiveElement(name, value); } return; } if (WriteStringElement(scope, writer, property, name, value)) return; var type = value.GetType(); var xmlWriter = writer as XmlWriterImpl; if (xmlWriter != null) { var surrogate = scope.GetSurrogate(type); if (surrogate != null) { surrogate.Write(xmlWriter.XmlWriter, value); return; } } var elementDef = scope.GetElementDef(type); if (elementDef != null) { var subScope = elementDef as IScope; WriteElement(subScope, writer, value, elementDef, elementDef.Name); return; } var collection = value as IEnumerable; if (collection != null) { var itemDef = new CollectionItemDef(property.ItemName, Reflector.GetItemType(type)); var empty = true; foreach (var item in collection) { if (empty) { writer.WriteStartCollection(name); empty = false; } if (item == null) { writer.WriteNullItem(property.ItemName); continue; } WriteValue(scope, writer, itemDef, property.ItemName, item); } if (!empty) writer.WriteEndCollection(); return; } throw new InvalidOperationException(string.Format("Unknown element. Name: {0}. Type: {1}.", name, type)); }