public static IConfiguredDataSource GetToTargetDataSourceOrNullForTargetType(this IObjectMappingData mappingData)
        {
            var toTargetDataSources = mappingData
                                      .MapperData
                                      .MapperContext
                                      .UserConfigurations
                                      .GetDataSourcesForToTarget(mappingData.MapperData);

            if (toTargetDataSources.None())
            {
                return(null);
            }

            foreach (var dataSource in toTargetDataSources)
            {
                mappingData = mappingData.WithSource(dataSource.SourceMember);

                if (mappingData.IsTargetConstructable())
                {
                    return(dataSource);
                }
            }

            // TODO: Cover: Unconstructable ToTarget data source
            return(null);
        }
        protected override bool TargetCannotBeMapped(IObjectMappingData mappingData, out Expression nullMappingBlock)
        {
            if (mappingData.MapperData.TargetCouldBePopulated())
            {
                // If a target complex type is readonly or unconstructable
                // we still try to map to it using an existing non-null value:
                return(base.TargetCannotBeMapped(mappingData, out nullMappingBlock));
            }

            if (mappingData.IsTargetConstructable())
            {
                return(base.TargetCannotBeMapped(mappingData, out nullMappingBlock));
            }

            var targetType = mappingData.MapperData.TargetType;

            if (targetType.IsAbstract() && DerivedTypesExistForTarget(mappingData))
            {
                return(base.TargetCannotBeMapped(mappingData, out nullMappingBlock));
            }

            nullMappingBlock = Expression.Block(
                ReadableExpression.Comment("Cannot construct an instance of " + targetType.GetFriendlyName()),
                targetType.ToDefaultExpression());

            return(true);
        }
        protected override bool TargetCannotBeMapped(IObjectMappingData mappingData, out string reason)
        {
            if (mappingData.MapperData.TargetCouldBePopulated())
            {
                // If a target complex type is readonly or unconstructable
                // we still try to map to it using an existing non-null value:
                return(base.TargetCannotBeMapped(mappingData, out reason));
            }

            if (mappingData.IsTargetConstructable())
            {
                return(base.TargetCannotBeMapped(mappingData, out reason));
            }

            var targetType = mappingData.MapperData.TargetType;

            if (targetType.IsAbstract() && DerivedTypesExistForTarget(mappingData.MapperData))
            {
                return(base.TargetCannotBeMapped(mappingData, out reason));
            }

            reason = "Cannot construct an instance of " + targetType.GetFriendlyName();
            return(true);
        }