private static void WriteElement(bool isMultiple, object value, IElementWriter list, Func <IElementWriter, object, ObjectPropertyInfo> getPropertyFunc, Action <ObjectPropertyInfo, object> writeAction, Action <bool> nullAction, Action <IList> listAction) { if (nullAction != null) { nullAction(false); } if (isMultiple) { IList listValue = value.Convert <IList>(); if (listAction != null) { listAction(listValue); } foreach (object itemValue in listValue) { ObjectPropertyInfo property = getPropertyFunc(list, itemValue); if (property != null) { writeAction(property, itemValue); } } } else { ObjectPropertyInfo property = getPropertyFunc(list, value); if (property != null) { writeAction(property, value); } } }
private void OnComplete(object sender, EventArgs e) { var itemWriter = _base as ItemElementWriter; if (itemWriter != null) { _result.AddReadOnly(itemWriter.Result as IReadOnlyItem); itemWriter.Complete -= OnComplete; } else { var elemWriter = _base as AmlElementWriter; if (elemWriter != null) { elemWriter.Complete -= OnComplete; var elem = elemWriter.Root; if (elem == null) { throw new InvalidOperationException(); } if (elem.Name == "Message") { _result.AddMessageNode(elem); } else { switch (elem.ElementByName("faultcode").Value) { case "0": _result.Exception = new NoItemsFoundException(elem, _database, _query); break; case "1001": if (elem.ElementByName("detail").ElementByName("error_resolution_report").Exists) { _result.Exception = new ValidationReportException(elem, _database, _query); } else { _result.Exception = new ValidationException(elem, _database, _query); } break; default: _result.Exception = new ServerException(elem, _database, _query); break; } } } else { throw new InvalidOperationException(); } } _base = null; }
public void WriteObjectElement(ObjectElementAttribute attribute, object writer, object value, WriteSettings settings, ObjectPropertyInfo info, object serializerData) { JsonTextWriter jsonWriter = writer.Convert <JsonTextWriter>(); QName name = info.QName; if (attribute.IsMultiple) { var list = value.Convert <IEnumerable>(); if (attribute.UseJsonObject) { var valueList = EnumUtil.Convert(list); IElementWriter elementWriter = serializerData.Convert <IElementWriter>(); var itemGroup = from item in valueList where item != null let propInfo = elementWriter.Get(item.GetType()) group new { Item = item, Info = propInfo } by propInfo.LocalName; foreach (var group in itemGroup) { jsonWriter.WritePropertyName(group.Key); jsonWriter.WriteStartArray(); foreach (var item in group) { WriteAObject(writer, item.Item, item.Info.ModelName, settings, jsonWriter); } jsonWriter.WriteEndArray(); } //foreach (object itemValue in list) //{ // if (itemValue == null) // continue; // var subPropertyInfo = elementWriter.Get(itemValue.GetType()); // jsonWriter.WritePropertyName(subPropertyInfo.LocalName); // WriteAObject(writer, itemValue, subPropertyInfo.ModelName, settings, jsonWriter); //} } else { if (info.WriteMode == SerializerWriteMode.WriteName) { jsonWriter.WritePropertyName(name.LocalName); } jsonWriter.WriteStartArray(); foreach (var itemValue in list) { Write(writer, itemValue, info.ModelName, settings, name, serializerData, null); } jsonWriter.WriteEndArray(); } } else { jsonWriter.WritePropertyName(name.LocalName); Write(writer, value, info.ModelName, settings, name, serializerData, null); } }
public override void WriteStartElement(string prefix, string localName, string ns) { _value = null; _inElement = true; var name = GetName(localName, ns); if (_base != null) { _base.WriteStartElement(name); } else { switch (name) { case "Item": if (_names.Count < 1 || _names.Peek() != "Message") { _base = new ItemElementWriter(_factory) { ReadOnly = _readOnly }; _base.Complete += OnComplete; _base.WriteStartElement(name); } break; case "SOAP-ENV:Fault": _base = new AmlElementWriter(_factory) { ReadOnly = _readOnly }; _base.Complete += OnComplete; _base.WriteStartElement(name); break; case "Message": _base = new AmlElementWriter(_factory) { ReadOnly = _readOnly }; _base.Complete += OnComplete; _base.WriteStartElement(name); break; case "Result": _resultText = new StringBuilder(); break; } _names.Push(name); } }
public ElementWriterTests() { _elementWriter = new ElementWriter(); }