2017-05-12 2 views
9

Ich habe überall gesucht: stackoverflow, automapper Dokumentation, Internet und konnte einfach keine Informationen zu diesem finden, auch das scheint ein sehr häufiges Problem zu sein.Wie NULL-Werte für alle Quellmitglieder während des Mappings in Automapper 6 ignoriert werden?

Mein Mapping:

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

Das funktioniert nicht, weil src Quellobjekt darstellt (StatusLevelDTO), keine Quelleigenschaft (glaube ich).

Um genauer zu sein, wenn ich ObjectA zu ObjectB zuordnen, ObjectA.SomeValue ist NULL und ObjectB.SomeValue ist 2, möchte ich das Zielobjekt seinen Wert (2).

Ich habe diese Frage gesehen: Automapper skip null values with custom resolver und versucht, die ersten beiden Antworten, aber sie scheinen beide 6.

Gibt es eine Möglichkeit für eine veraltete Version werden diese in AutoMapper 6 geschieht? Ich benutze 6.0.2 um genau zu sein.

Antwort

14

Method Condition nun fünf Überlastungen aufweist, von denen ein Prädikat des Typs

Func<TSource, TDestination, TMember, bool> 

Diese TMember Parameter akzeptiert ist das Quellenelement. So können Sie Quelleneintrag überprüfen null:

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

Eigentlich habe ich etwas ähnliches vor dem Posten dieser Frage versucht. Der einzige Unterschied war, dass ich 4 Parameter wie folgt verwendet habe: (src, dest, srcMember, dstMember) und es hat nicht funktioniert. Ich habe es erneut mit deiner Version überprüft und es funktioniert immer noch nicht. – Sikor

+0

@Sikor Ich habe sowohl meine Lösung als auch die Überladung mit vier Parametern überprüft - beide funktionieren gut und behalten die Zielwerte bei, wenn das Quellelement null ist. Stellen Sie sicher, dass das Zielobjekt über Werte ungleich null verfügt, wenn Sie es an den Zuordner übergeben –

+0

Seltsam, sind Sie sicher, dass Sie über die Version 6.0.2 verfügen? – Sikor

1

Die Lösung here für mein Projekt arbeitet, das AutoMapper 6.0.2 verwendet wird. In früheren Projekten mit AutoMapper 4 hatte ich IsSourceValueNull verwendet, um das gleiche Verhalten zu erzielen.

Ich habe eine kleine Änderung an der ursprünglichen Lösung vorgenommen. Anstatt den Typ der Eigenschaft zu überprüfen, die zugeordnet werden soll, setze ich den Filter in ForAllPropertyMaps, um den Typ des Quellobjekts zu überprüfen, sodass der benutzerdefinierte Resolver nur auf Zuordnungen von diesem Quellobjekt angewendet wird. Aber der Filter kann beliebig eingestellt werden.

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