Exemplo n.º 1
0
        private object ReadObject(Type type, XElement element)
        {
            if (type == null)
            {
                throw new ArgumentNullException("type");
            }

            element = ApplyMessageDeserializationBehaviorIfNecessary(type, element);

            if (HaveCustomValueConvertor(type))
            {
                var convertorType = reflection.GetGenericTypeOf(typeof(IValueConvertor <>), type);
                var convertor     = serviceLocator.Resolve(convertorType);
                return(reflection.InvokeFromElement(convertor, element));
            }
            if (HaveCustomSerializer(type))
            {
                var customSerializer = customElementSerializers.First(s => s.CanSerialize(type));
                return(customSerializer.FromElement(type, element));
            }
            if (type == typeof(byte[]))
            {
                return(Convert.FromBase64String(element.Value));
            }
            if (CanParseFromString(type))
            {
                return(FromString(type, element.Value));
            }
            if (ShouldTreatAsDictionary(type))
            {
                return(ReadDictionary(type, element));
            }
            if (typeof(IEnumerable).IsAssignableFrom(type))
            {
                return(ReadList(type, element));
            }
            object instance = reflection.CreateInstance(type);

            foreach (var prop in element.Elements())
            {
                var property = prop;
                reflection.Set(instance,
                               prop.Name.LocalName,
                               typeFromProperty =>
                {
                    var propType = reflection.GetTypeFromXmlNamespace(property.Name.NamespaceName);
                    return(ReadObject(propType ?? typeFromProperty, property));
                });
            }
            return(instance);
        }