c# - Automapper:将带有内部对象列表的单个对象映射到列表

标签 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属性(property)。但是,我不知道如何映射 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);

为了解决这个问题,我从 Prices 创建了 map 至 PriceDto而不是 RemoteData然后使用 foreach分配 Ticker .但是,我想了解如何使用自动映射器进行操作。

最佳答案

对于这种情况,一个好的方法是使用 .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 .

关于c# - Automapper:将带有内部对象列表的单个对象映射到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46725911/

相关文章:

c# - 新位图锁定的免费文件(文件路径)

c# - 自动映射器 - 使用集合映射对象

c# - .IsBodyHtml=true 导致发送一个空的电子邮件正文,但是 .IsBodyHtml=false 发送正文内容

c# - 如何为 ASP.NET 5 应用程序设置语言环境?

asp.net-mvc-2 - Html.DropDownList AutoMapper 问题

c# - 使用 Automapper 从动态/JObject 映射到任意类型而不创建多个映射

automapper - 自动映射器,将一种对象成员类型映射到多种具体类型

c# - C# 中的自动映射器错误。...的最佳重载匹配有一些无效参数

c# - Entity Framework - 将数据库字段映射到 uint

c# - 此上下文中不支持 ASP.NET 代码块 Site.master