自动映射:将包含内部对象列表的单个对象映射到刚才列出的对象

时间:2017-10-13 08:43:52

标签: c# automapper

我有以下dto对象:

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

源对象:

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

结果,我希望获得PriceDto个对象的集合。我知道如何映射Ticker属性。但是,我不知道如何正确映射Prices

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

此外,Automapper无法找到配置,因为我有一个RemoteData,但我想获得IList<PriceDto>

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

对于变通方法,我创建了从PricesPriceDto而不是RemoteData的地图,然后只使用foreach分配Ticker。但是,我想了解如何使用automapper。

1 个答案:

答案 0 :(得分:5)

针对此案例的一个好方法是使用.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()
                    );
            });
...

了解更多信息read about custom type converters

我希望它有所帮助。