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