2013-07-23 15 views
27

Supponiamo che io sono i seguenti enti (classi)Come configurare il mapping condizionale in AutoMapper?

public class Target 
{ 
    public string Value; 
} 


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

Ora voglio configurare Auto Mappa, a Map Value1 al valore se Valore1 inizia con "A", ma per il resto voglio mappare Value2 a Valore.

Questo è quello che ho finora:

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!?***>> 
      }) 

Tuttavia, la parte sfugge alle ancora me è come dire automapper a andare a fare s.Value2 dovrebbe la condizione in precedenza non riesce.

Mi sembra che l'API non sia stata progettata così come potrebbe essere ... ma potrebbe essere che la mia mancanza di conoscenza si intrometta.

+1

solo per un secondo 'ForMember' chiamare con l'inverso della condizione in questo uno se siete veramente bloccato e la risposta fornita da Tejal non è tagliato. – Joe

risposta

74

provare questa opzione Condizione

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

viene utilizzata per aggiungere le condizioni per le proprietà che devono essere soddisfatti prima che la proprietà sarà mappato e l'opzione MapFrom viene utilizzato per eseguire fonte custom/mappature membro di destinazione.

+0

Hmmm In realtà ho bisogno di un modo per accedere al valore target in qualche modo - ma ancora questo risponde alla domanda posta. – Alwyn

+0

Cosa stai cercando esattamente di fare? – Tejal

+0

La condizione è un po 'più complessa di quella descritta, che dipende solo dal valore di origine. Devo in qualche modo raggiungere il resolutioncontext e capire anche il valore finale. – Alwyn

2

Con la mappatura condizionale è possibile configurare solo quando la mappatura deve essere eseguita per la proprietà di destinazione specificata.

Significa che non è possibile definire due mapping con condizioni diverse per la stessa proprietà di destinazione.

Se si dispone di una condizione come "se la condizione è vera quindi utilizzare PropertyA altro uso PropertyB" allora si dovrebbe fare così "Tejal" ha scritto:

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

automapper consente di aggiungere le condizioni per le proprietà che deve essere soddisfatti prima che la proprietà venga mappata.

Stavo facendo la mappatura con alcune condizioni enum, ho un aspetto che è poco sforzo per la comunità dalla mia parte.

.ForMember(dest => dest.CurrentOrientationName, opts => opts.MapFrom(src => src.IsLandscape ? PageSetupEditorOrientationViewModel.Orientation.Landscape : PageSetupEditorOrientationViewModel.Orientation.Portrait)); 
Problemi correlati