Exemple #1
0
        /// <summary>
        ///     Assume specified xml element represents an object, convert the xml element to the object instance.
        /// </summary>
        /// <param name="element">The xml element that contains the contents of the object.</param>
        /// <param name="settings">
        ///     Convert settings used during the convert. <see cref="XConvertSettings.Default" /> is used if the value is
        ///     <see langword="null" />.
        /// </param>
        /// <returns>Object that converted from <paramref name="element" />.</returns>
        public object ToObject(XElement element, XConvertSettings settings)
        {
            Ensure.Argument.NotNull(element, "element");

            var objType = XConvertUtil.ParseType(element);

            Ensure.Argument.NotNull(objType, "element", "Object type not found.");

            return(ToObject(objType, element, settings));
        }
Exemple #2
0
        protected override void PopulateObjectImpl(object obj, XElement element, XConvertSettings settings)
        {
            var collectionProxy = CreateCollectionProxy(obj);

            foreach (var itemElement in element.Elements(ItemName))
            {
                var itemType = XConvertUtil.ParseType(itemElement) ?? collectionProxy.ItemType;
                var item     = XConvert.ToObject(itemType, itemElement, settings);
                collectionProxy.Add(item);
            }
        }
Exemple #3
0
        protected virtual void ToObjectArgumentsCheck(Type objType, XElement element)
        {
            Ensure.Argument.NotNull(element, "element");
            Ensure.Argument.NotNull(objType, "objType");

            var savedType = XConvertUtil.ParseType(element);

            if (savedType != null)
            {
                Ensure.Argument.Is(objType, "objType", savedType);
                EnsureArgumentCanConvert(savedType, "element");
            }
            else
            {
                EnsureArgumentCanConvert(objType, "objType");
            }
        }
Exemple #4
0
        protected override void PopulateObjectImpl(object obj, XElement element, XConvertSettings settings)
        {
            var objType     = obj.GetType();
            var membersDict = GetMembers(obj);

            foreach (var memberElement in element.Elements())
            {
                string     name;
                MemberInfo member;
                GetMemberInfo(objType, membersDict, memberElement, out name, out member);
                if (member == null)
                {
                    switch (MissingMemberHandling)
                    {
                    case MissingMemberHandling.Ignore:
                        continue;

                    case MissingMemberHandling.ThrowException:
                        throw new MissingMemberException(objType.FullName, name);

                    default:
                        continue;
                    }
                }

                var declareMemberType = GetDeclareMemberType(member);
                var actualMemberType  = XConvertUtil.ParseType(memberElement);
                if (actualMemberType != null)
                {
                    if (actualMemberType != declareMemberType && !actualMemberType.IsSubclassOf(declareMemberType))
                    {
                        throw new XmlException(string.Format(
                                                   "Object(of type {0}) member type({1}) from xml does not match with its declare type({2}) of the object.",
                                                   objType, actualMemberType, declareMemberType));
                    }
                }

                var usingMemberType = actualMemberType ?? declareMemberType;
                var converter       = settings.FindConverter(usingMemberType);
                var value           = converter.ToObject(usingMemberType, memberElement, settings);
                SetMemberValue(member, obj, value);
            }
        }