private void DeserializeItems(Type entityType, Type itemType, IList parent, ListPropertyDescriptor metadata, ListItemPropertyDescriptor propDesc, string itemsStr, XmlSerializerContext context, bool isAttribute) { itemsStr = itemsStr.Trim(); if (!TypeHelper.IsValueType(itemType)) { throw new Exception("El item de tipo " + itemType.Name + " no es de tipo ValueType, no puede deserializarse de un atributo."); } ValueTypeConverter itemConverter = (ValueTypeConverter)context.GetConverter(itemType); //obtengo el tipo por el atributo ValueTypePropertyDescriptor itemDescriptor = propDesc.GetPropertyDescriptor <ValueTypePropertyDescriptor>(itemType, context); string itemSeparator = metadata.GetInlineItemSeparator(entityType, context, isAttribute); string[] items = itemsStr.Split(new string[] { itemSeparator }, StringSplitOptions.None); int last = items.Length; if (string.Compare(itemsStr[itemsStr.Length - 1].ToString(), itemSeparator) == 0) { last--; } object val; for (int i = 0; i < last; i++) { string item = items[i]; val = itemConverter.GetValueFromString(itemDescriptor, item, itemType, context); parent.Add(val); } }
private string GetInlineStringArray(ListPropertyDescriptor metadata, IEnumerable list, Type entityType, XmlSerializerContext context, bool isAttribute) { Type itemType = null; Type currentType = null; ValueTypeConverter itemConverter = null; StringBuilder attBuilder = new StringBuilder(); ValueTypePropertyDescriptor valPropDesc = null; string itemSeparator = metadata.GetInlineItemSeparator(entityType, context, isAttribute); bool first = true; foreach (object item in list) { if (item != null) { if (itemType == null) { itemType = item.GetType(); if (!TypeHelper.IsValueType(itemType)) { throw new Exception("El item de tipo " + itemType.Name + " no es de tipo ValueType, no puede serializarse en un atributo."); } itemConverter = (ValueTypeConverter)context.GetConverter(itemType); ListItemPropertyDescriptor itemDesc = metadata.GetItemPropertyDescriptor(context, true); valPropDesc = itemDesc.GetPropertyDescriptor <ValueTypePropertyDescriptor>(itemType, context); } currentType = item.GetType(); if (!currentType.Equals(itemType)) { throw new Exception("El item de tipo " + currentType.Name + " es direferente al primer item del array de tipo " + itemType.Name + ". No es posible serializar un array de diferentes tipos en un atributo."); } string val = itemConverter.GetValueAsString(valPropDesc, item, itemType, context); if (first) { first = false; } else { attBuilder.Append(itemSeparator); } attBuilder.Append(val); } } return(attBuilder.ToString()); }