public static void ArrayToXml(this IXmlArrayFieldInfoDescriptor arrayFieldDescriptor, string elementName, XElement parent, IEnumerable <dynamic> array)
        {
            XElement element = new XElement(elementName);

            parent.Add(element);
            foreach (ExpandoObject record in array)
            {
                XElement childElement = new XElement(arrayFieldDescriptor.ElementName);
                element.Add(childElement);

                foreach (KeyValuePair <string, object> keyValuePair in record)
                {
                    string propertyName = keyValuePair.Key;
                    if (!arrayFieldDescriptor.Fields.TryGetValue(keyValuePair.Key, out IFieldInfoTypeDescriptor fieldDescriptor))
                    {
                        fieldDescriptor = arrayFieldDescriptor.Fields.Values.FirstOrDefault(x => ((IXmlFieldPropertyNameInfoDescriptor)x).PropertyName == keyValuePair.Key);
                        if (fieldDescriptor == null)
                        {
                            throw new Exception($"The field {keyValuePair.Key} is not configured");
                        }
                    }

                    if (fieldDescriptor.IsArray)
                    {
                        ((IXmlArrayFieldInfoDescriptor)fieldDescriptor).ArrayToXml(propertyName, childElement, (IEnumerable <dynamic>)keyValuePair.Value);
                        continue;
                    }
                    ((IXmlFieldInfoDescriptor)fieldDescriptor).RecordToXml(propertyName, childElement, keyValuePair.Value);
                }
            }
        }
        public static ExpandoObject[] ToRecordArray(this IXmlArrayFieldInfoDescriptor fieldDescriptor, string name, XElement element)
        {
            IList <ExpandoObject> items = new List <ExpandoObject>();

            if (!element.HasElements)
            {
                return(items.ToArray());
            }

            XElement elementItem = null;

            foreach (XElement childElement in element.Elements())
            {
                if (childElement.Name.LocalName != name)
                {
                    continue;
                }

                elementItem = childElement;
                break;
            }

            if (elementItem == null || elementItem.Value == null)
            {
                return(null);
            }

            foreach (var elementArrayItem in elementItem.Elements())
            {
                var item = new ExpandoObject();
                foreach (KeyValuePair <string, IFieldInfoTypeDescriptor> fieldInfoTypeDescriptor in fieldDescriptor.Fields)
                {
                    string propertyName = string.IsNullOrWhiteSpace(((IXmlFieldPropertyNameInfoDescriptor)fieldInfoTypeDescriptor.Value).PropertyName)
                                ? fieldInfoTypeDescriptor.Key
                                : ((IXmlFieldPropertyNameInfoDescriptor)fieldInfoTypeDescriptor.Value).PropertyName;

                    if (fieldInfoTypeDescriptor.Value.IsArray)
                    {
                        ((IXmlArrayFieldInfoDescriptor)fieldInfoTypeDescriptor.Value).ToRecordArray(
                            propertyName,
                            elementArrayItem
                            );
                        continue;
                    }

                    item.TryAdd(propertyName,
                                ((IXmlFieldInfoDescriptor)fieldInfoTypeDescriptor.Value).ToRecord(fieldInfoTypeDescriptor.Key, elementArrayItem)
                                );
                }
                items.Add(item);
            }

            return(items.ToArray());
        }
 public static IXmlArrayFieldInfoDescriptor SetElementName(this IXmlArrayFieldInfoDescriptor descriptor, string elementName)
 {
     descriptor.ElementName = elementName;
     return(descriptor);
 }