private TypeMap FindTypeMap(object source, object destination, Type sourceType, Type destinationType, string profileName)
{
TypeMap typeMap = FindExplicitlyDefinedTypeMap(sourceType, destinationType);
if (typeMap == null && destinationType.IsNullableType())
{
typeMap = FindExplicitlyDefinedTypeMap(sourceType, destinationType.GetTypeOfNullable());
}
if (typeMap == null)
{
typeMap = _typeMaps.FirstOrDefault(x => x.SourceType == sourceType && x.GetDerivedTypeFor(sourceType) == destinationType);
if (typeMap == null)
{
foreach (var sourceInterface in sourceType.GetInterfaces())
{
typeMap = ((IConfigurationProvider)this).FindTypeMapFor(source, destination, sourceInterface, destinationType);
if (typeMap == null)
{
continue;
}
var derivedTypeFor = typeMap.GetDerivedTypeFor(sourceType);
if (derivedTypeFor != destinationType)
{
typeMap = CreateTypeMap(sourceType, derivedTypeFor, profileName, typeMap.ConfiguredMemberList);
}
break;
}
if ((sourceType.BaseType != null) && (typeMap == null))
{
typeMap = ((IConfigurationProvider)this).FindTypeMapFor(source, destination, sourceType.BaseType, destinationType);
}
}
}
return(typeMap);
}