2017-10-13 4 views
5

je les suivantes DTO objet:Automapper: Carte Un seul objet avec la liste des objets à l'intérieur à la liste juste

public class PriceDto 
{ 
    public string Ticker {get; set;} 
    public double Open {get; set;} 
    public double Close {get; set;} 
} 

Les objets source:

public class RemoteData 
{ 
    public Security Security { get; set; } 
    public IList<Prices> Prices{ get; set; } 
} 

public class Security 
{ 
    public string Ticker {get; set;} 
} 

public class Prices 
{ 
    public double Open {get; set;} 
    public double Close {get; set;} 
} 

En conséquence, je veux obtenir la collecte de PriceDto objets. Je sais comment faire pour cartographier la propriété Ticker. Mais, je ne sais pas comment la carte Prices correctement:

CreateMap<RemoteData, PriceDto>() 
    .ForMember(d => d.Ticker, opt => opt.MapFrom(s => s.Security.Ticker)); 

En outre, Automapper ne peut pas trouver la configuration parce que j'ai même RemoteData, mais je veux IList<PriceDto>:

var json = await rangeUrl.GetJsonAsync<RemoteData>(); 
var dtos = _mapper.Map<IList<PriceDto>>(json); 

Pour la solution de contournement, j'ai créé la carte de Prices à PriceDto au lieu de RemoteData et puis utilisez simplement foreach pour affecter Ticker. Mais, je veux savoir comment le faire avec automapper.

+3

Copie possible de [Possible d'utiliser AutoMapper pour mapper un objet à une liste d'objets?] (Https://stackoverflow.com/questions/18096034/possible-pour-utiliser-automapper-pour-mapper-un-objet- to-list-of-objects) – Rhumborl

Répondre

2

Une bonne approche pour ce cas est d'utiliser le .ConvertUsing.

... 
      Mapper.Initialize(cfg => 
      { 
       cfg.CreateMap<RemoteData, List<PriceDto>>() 
        .ConvertUsing(source => source.Prices?.Select(p => new PriceDto 
         { 
          Ticker = source.Security?.Ticker, 
          Open = p.Open, 
          Close = p.Close 
         }).ToList() 
        ); 
      }); 
... 

Pour plus d'informations read about custom type converters.

J'espère que ça aide.

+0

Oui, probablement convertisseur personnalisé est le meilleur pour cette tâche. Je vous remercie. – user348173