¿Cómo ignorar los valores nulos para todos los miembros de origen durante el mapeo en Automapper 6?

¿Cómo ignorar los valores nulos para todos los miembros de origen durante el mapeo en Automapper 6?

Método Condition ahora tiene cinco sobrecargas, una de las cuales acepta predicado de tipo

Func<TSource, TDestination, TMember, bool>

este parámetro TMember es el miembro de origen. Entonces puede verificar el miembro de origen para nulo:

CreateMap<StatusLevelDTO, StatusLevel>()
     .ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null));

La solución aquí funciona para mi proyecto, que usa AutoMapper 6.0.2. En proyectos anteriores que usaban AutoMapper 4, había usado IsSourceValueNull para lograr el mismo comportamiento.

Hice un pequeño cambio a la solución original. En lugar de verificar el tipo de propiedad que se va a asignar, configuro el filtro en ForAllPropertyMaps para verificar el tipo del objeto de origen, de modo que la resolución personalizada solo se aplique a los mapas de ese objeto de origen. Pero el filtro se puede configurar en cualquier cosa según sea necesario.

var config = new MapperConfiguration(cfg =>
{
    cfg.ForAllPropertyMaps(
        pm => pm.TypeMap.SourceType == typeof(<class of source object>),
        (pm, c) => c.ResolveUsing<object, object, object, object>(new IgnoreNullResolver(), pm.SourceMember.Name));
});

class IgnoreNullResolver : IMemberValueResolver<object, object, object, object>
{
    public object Resolve(object source, object destination, object sourceMember, object destinationMember, ResolutionContext context)
    {
        return sourceMember ?? destinationMember;
    }
}

Me inspiré en @Sergey Berezovskiy , e hice esta configuración para todos los miembros de todos los mapas en la configuración principal:

Mapper.Initialize(cfg =>
{
  cfg.ForAllMaps((obj, cnfg) => cnfg.ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null)));
}