2013-07-23 9 views
27

Angenommen, ich habe folgende Einrichtungen (Klassen)So konfigurieren Sie die bedingte Zuordnung in AutoMapper?

public class Target 
{ 
    public string Value; 
} 


public class Source 
{ 
    public string Value1; 
    public string Value2; 
} 

Jetzt möchte ich Auto Map, konfigurieren Value1 auf Karte Wert, wenn Wert1 mit "A" beginnt, aber ansonsten will ich Value2 to Value abzubilden. Diese

ist das, was ich bisher:

Mapper 
    .CreateMap<Source,Target>() 
    .ForMember(t => t.Value, 
     o => 
      { 
       o.Condition(s => 
        s.Value1.StartsWith("A")); 
       o.MapFrom(s => s.Value1); 
        <<***But then how do I supply the negative clause!?***>> 
      }) 

jedoch der Teil der noch entzieht sich mir, wie AutoMapper zu sagen, gehen nehmen s.Value2 sollte der frühere Zustand ausfällt.

Es scheint mir nur, dass die API nicht so gut entworfen wurde, wie es sein könnte ... aber vielleicht ist es mein Mangel an Wissen, das in die Quere kommt.

+1

Haben Sie einfach einen zweiten 'ForMember'-Aufruf mit der Umkehrung der Bedingung in diesem Fall, wenn Sie wirklich stecken bleiben und die Antwort von Tejal nicht schneidet es. – Joe

Antwort

74

diese Option

Mapper.CreateMap<Source, Target>() 
     .ForMember(dest => dest.Value, 
        opt => opt.MapFrom 
        (src => src.Value1.StartsWith("A") ? src.Value1 : src.Value2)); 

Zustand Versuchen wird verwendet, um Bedingungen zu Eigenschaften hinzuzufügen, bevor diese Eigenschaft erfüllt werden müssen, werden kartiert und MapFrom Option können Sie benutzerdefinierte Quell-/Zielelement Zuordnungen durchzuführen.

+0

Hmmm ich brauche eigentlich einen Weg, um irgendwie auf den Zielwert zuzugreifen - aber das beantwortet trotzdem die gestellte Frage. – Alwyn

+0

Was genau versuchst du zu tun? – Tejal

+0

Die Bedingung ist etwas komplexer als die beschriebene, die nur vom Quellwert abhängt. Ich muss irgendwie zum resolutioncontext kommen und den Zielwert herausfinden. – Alwyn

2

Mit der bedingten Zuordnung können Sie nur konfigurieren, wann das Mapping für die angegebene Zieleigenschaft ausgeführt werden soll.

Es bedeutet also, dass Sie nicht zwei Zuordnungen mit unterschiedlichen Bedingungen für dieselbe Zieleigenschaft definieren können.

Wenn Sie eine Bedingung, wie „wenn die Bedingung wahr ist, dann ist verwenden propertyâ sonst PropertyB verwenden“, dann sollten Sie es tun, wie „Tejal“ wrote:

opt.MapFrom(src => src.Value1.StartsWith("A") ? src.Value1 : src.Value2) 
2

AutoMapper können Sie die Bedingungen zu Eigenschaften hinzuzufügen, das muss erfüllt sein, bevor diese Eigenschaft zugeordnet wird.

Ich machte das Mapping mit einigen Enum-Bedingungen, ein Blick, der wenig Aufwand für die Community von meiner Seite ist.

Verwandte Themen