Come ignorare i valori null per tutti i membri di origine durante la mappatura in Automapper 6?

Come ignorare i valori null per tutti i membri di origine durante la mappatura in Automapper 6?

Metodo Condition ora ha cinque overload, uno dei quali accetta predicati di tipo

Func<TSource, TDestination, TMember, bool>

questo parametro TMember è il membro di origine. Quindi puoi controllare il membro di origine per null:

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

La soluzione qui funziona per il mio progetto, che utilizza AutoMapper 6.0.2. Nei precedenti progetti che utilizzavano AutoMapper 4, avevo utilizzato IsSourceValueNull per ottenere lo stesso comportamento.

Ho apportato una piccola modifica alla soluzione originale. Invece di controllare il tipo della proprietà da mappare, ho impostato il filtro in ForAllPropertyMaps per controllare il tipo dell'oggetto di origine, in modo che il risolutore personalizzato si applichi solo alle mappe di quell'oggetto di origine. Ma il filtro può essere impostato su qualsiasi cosa secondo necessità.

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;
    }
}

Mi sono ispirato a @Sergey Berezovskiy 's risposta e ho effettuato questa configurazione per tutti i membri di tutte le mappe nella configurazione principale:

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