private static bool IsStringType(DynamicExtendableObject member)
 {
     if (!HasObjectValue(member))
     {
         return false;
     }
     return member.ObjectValue.GetType() == typeof(string);
 }
 private static void AddChildElements(XElement parentElement, DynamicExtendableObject dynamicObject)
 {
     IEnumerable values = dynamicObject.ObjectValue as IEnumerable;
     foreach (var item in values)
     {
         XElement element = new XElement(dynamicObject.ObjectName, item);
         parentElement.Add(element);
     }
 }
        public static bool HasDynamicExtendableObjectValue(DynamicExtendableObject member)
        {
            if (!HasObjectValue(member))
            {
                return false;
            }

            return member.ObjectValue.GetType() == typeof(DynamicExtendableObject);
        }
 public static bool HasEnumerableExtendableObjectValue(DynamicExtendableObject member)
 {
     if (!HasObjectValue(member))
     {
         return false;
     }
     IEnumerable obj = member.ObjectValue as IEnumerable<DynamicExtendableObject>;
     return obj != null;
 }
        public static bool HasEnumerableValue(DynamicExtendableObject member)
        {
            if (IsStringType(member))
            {
               return false;
            }

            IEnumerable obj=member.ObjectValue as IEnumerable;
            return obj != null;
        }
 private static void AddXmlElement(XElement parentElement, DynamicExtendableObject dynamicObject)
 {
     foreach (DynamicExtendableObject obj in dynamicObject.Members)
     {
         XElement element = AddNewChildElement(parentElement, obj);
         if (element != null)
         {
             AddXmlElement(element, obj);
         }
     }
 }
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            DynamicExtendableObject obj =
                this.Members.FindLast(p => p.ObjectName == binder.Name);
            if (obj != null)
            {
                obj.ObjectValue = value;
                return true;
            }

            DynamicExtendableObject item = new DynamicExtendableObject(binder.Name, value);
            item.Container = this;
            this.Members.Add(item);
            return true;
        }
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            DynamicExtendableObject obj =
                this.Members.FindLast(p => p.ObjectName == binder.Name);
            if (obj != null)
            {
                result = obj.ObjectValue;
                return true;
            }

            DynamicExtendableObject item = new DynamicExtendableObject(binder.Name, null);
            item.ObjectValue = item;
            item.Container = this;
            this.Members.Add(item);
            result = item;
            return true;
        }
        private static XElement AddNewChildElement(XElement parentElement, DynamicExtendableObject member)
        {
            if (DynamicObjectHelper.HasDynamicExtendableObjectValue(member))
            {
                if (member.Members.Count == 0)
                {
                    XElement element = new XElement(member.ObjectName);
                    parentElement.Add(element);
                    dynamic currentObj = member.ObjectValue as DynamicExtendableObject;
                    element.Add(ToXml(currentObj));
                    return null;
                }
                else
                {
                    XElement element = new XElement(member.ObjectName);
                    parentElement.Add(element);
                    return element;
                }
            }
            if (DynamicObjectHelper.HasEnumerableExtendableObjectValue(member))
            {
                XElement element = new XElement(member.ObjectName);
                parentElement.Add(element);
                IEnumerable objects = member.ObjectValue as IEnumerable<DynamicExtendableObject>;
                foreach (DynamicExtendableObject item in objects)
                {
                    element.Add(ToXml(item));
                }

                return element;
            }           
            if (DynamicObjectHelper.HasEnumerableValue(member))
            {
                AddChildElements(parentElement, member);
            }
            else
            {
                XElement element = new XElement(member.ObjectName, member.ObjectValue);
                parentElement.Add(element);
            }
            return null;
        }
 public static XElement ToXml(DynamicExtendableObject dynamicObject)
 {
     XElement parentElement = new XElement(dynamicObject.ObjectName);
     AddXmlElement(parentElement, dynamicObject);
     return parentElement;
 }
 private static bool HasObjectValue(DynamicExtendableObject member)
 {
     return (member != null) && (member.ObjectValue != null);
 }