NServiceBus.XmlDeserialization.InferNodeType C# (CSharp) Method

InferNodeType() private method

private InferNodeType ( XmlNode node, object parent ) : Type
node System.Xml.XmlNode
parent object
return System.Type
        Type InferNodeType(XmlNode node, object parent)
        {
            var name = node.Name;
            var typeName = name;

            if (!string.IsNullOrEmpty(defaultNameSpace))
            {
                typeName = $"{defaultNameSpace}.{typeName}";
            }

            if (name.Contains(":"))
            {
                var colonIndex = node.Name.IndexOf(":");
                name = name.Substring(colonIndex + 1);
                var prefix = node.Name.Substring(0, colonIndex);
                var ns = prefixesToNamespaces[prefix];

                typeName = $"{ns.Substring(ns.LastIndexOf("/") + 1)}.{name}";
            }

            if (name.Contains("NServiceBus."))
            {
                typeName = name;
            }

            if (parent != null)
            {
                if (parent is IEnumerable)
                {
                    if (parent.GetType().IsArray)
                    {
                        return parent.GetType().GetElementType();
                    }

                    var listImplementations = parent.GetType().GetInterfaces().Where(interfaceType => interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IList<>)).ToList();
                    if (listImplementations.Any())
                    {
                        var listImplementation = listImplementations.First();
                        return listImplementation.GetGenericArguments().Single();
                    }

                    var args = parent.GetType().GetGenericArguments();

                    if (args.Length == 1)
                    {
                        return args[0];
                    }
                }

                var prop = parent.GetType().GetProperty(name);

                if (prop != null)
                {
                    return prop.PropertyType;
                }
            }

            var mappedType = mapper.GetMappedTypeFor(typeName);

            if (mappedType != null)
            {
                return mappedType;
            }

            logger.Debug($"Could not load {typeName}. Trying base types...");
            foreach (var baseType in messageBaseTypes)
            {
                try
                {
                    logger.Debug($"Trying to deserialize message to {baseType.FullName}");
                    return baseType;
                }
                // ReSharper disable once EmptyGeneralCatchClause
                catch
                {
                    // intentionally swallow exception
                }
            }

            throw new Exception($"Could not determine type for node: '{node.Name}'.");
        }