/// <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)); }
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); } }
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"); } }
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); } }