/// <summary> /// Populates an object from the attributes defined on the specified data element. /// </summary> /// <param name="state">The loader state.</param> /// <param name="objectInstance">The object instance.</param> /// <param name="objectElement">The object element.</param> /// <returns>The object instance.</returns> private Object PopulateObjectFromAttributes(ObjectLoaderState state, Object objectInstance, XElement objectElement) { foreach (var attr in objectElement.Attributes()) { if (IsReservedKeyword(attr.Name.LocalName)) { continue; } var attrMember = ObjectLoaderMember.Find(objectInstance, attr.Name.LocalName, state.IgnoreMissingMembers); if (attrMember != null) { if (state.Resolver != null && state.Resolver(objectInstance, attr.Name.LocalName, attr.Value)) { continue; } var attrValue = ObjectResolver.FromString(attr.Value, attrMember.MemberType); attrMember.SetValue(attrValue, null); } } return(objectInstance); }
/// <summary> /// Populates an object member from the specified data element. /// </summary> /// <param name="state">The loader state.</param> /// <param name="objectInstance">The object instance.</param> /// <param name="memberElement">The element that defines the member.</param> /// <param name="skipReservedKeywords">A value indicating whether to skip elements with the same names as reserved keywords.</param> /// <returns>The object instance.</returns> private Object PopulateMemberFromElement(ObjectLoaderState state, Object objectInstance, XElement memberElement, Boolean skipReservedKeywords = true) { if (IsReservedKeyword(memberElement.Name.LocalName)) { if (skipReservedKeywords || IsForbiddenKeyword(memberElement.Name.LocalName)) { return(objectInstance); } } if (state.Resolver != null && state.Resolver(objectInstance, memberElement.Name.LocalName, memberElement.Value)) { return(objectInstance); } var member = ObjectLoaderMember.Find(objectInstance, memberElement.Name.LocalName, state.IgnoreMissingMembers); if (member == null) { return(objectInstance); } // Handle array values. if (member.MemberType.IsArray) { PopulateArray(state, member, memberElement); return(objectInstance); } // Handle list values. if (IsListType(member.MemberType)) { PopulateList(state, member, memberElement); return(objectInstance); } // Handle generic enumerables. if (IsEnumerableType(member.MemberType)) { PopulateEnumerable(state, member, memberElement); return(objectInstance); } // Handle complex and simple objects. if (memberElement.Elements().Any()) { var complexType = GetTypeFromElement(state, member.MemberType, memberElement); var complexTypeValue = member.GetValueFromData(memberElement); if (complexTypeValue == null) { complexTypeValue = CreateObject(state, complexType, null, GetSpecifiedConstructorArguments(memberElement)); if (!complexType.IsValueType) { member.SetValueFromData(complexTypeValue, memberElement); } } if (!member.IsIndexer) { complexTypeValue = PopulateObjectFromAttributes(state, complexTypeValue, memberElement); } complexTypeValue = PopulateObjectFromElements(state, complexTypeValue, memberElement); if (complexType.IsValueType) { member.SetValueFromData(complexTypeValue, memberElement); } } else { if (String.IsNullOrEmpty(memberElement.Value)) { return(objectInstance); } var memberValue = ParseValue(memberElement.Value, member.MemberType, state.Culture); member.SetValueFromData(memberValue, memberElement); } return(objectInstance); }