是否可以基于源中的集合在目的地上创建一个集合?

时间:2018-12-20 18:56:02

标签: c# automapper

说我有

public class A 
{ 
  public List<int> Ids {get;set;}
}
public class B 
{ 
   public List<Category> Categories {get;set;}
}
public class Category 
{ 
   public string Name {get;set;} //will be blank on map
   public int CategoryId {get;set;}
}

var source = new A {...};

var b  = mapper.Map<A, B>(source);

因此,在映射时,它实际上会在dest上创建一个新的集合,但会根据源集合中的内容来映射ID,dest的其他属性将为空白,因为没有什么可地图。

如何设置配置以执行此映射?

1 个答案:

答案 0 :(得分:0)

您需要ForMemberMapFromForAllOtherMembers的组合:

Mapper.Initialize(cfg =>
                  {
                      cfg.CreateMap<A, B>()
                         .ForMember(dest => dest.Categories, opt => opt.MapFrom(src => src.Ids));

                      cfg.CreateMap<int, Category>()
                         .ForMember(dest => dest.CategoryId, opt => opt.MapFrom(src => src))
                         .ForAllOtherMembers(opt => opt.Ignore());
                  });

MapFrom将允许您覆盖AM通常执行的默认按名称映射。如第4行所示,我们可以说源代码中的Ids映射到目标类中的Categories

但是现在您需要重写int的映射方式,因为这是Ids中的事物类型。使用MapFrom,您(不必)必须为源提供属性-整个源本身可以是被映射的事物。因此,在第7行中,我们正在映射来自第4行中的映射的int,并说它们应映射到目标类的CategoryId属性。最后,我们只是简单地告诉AM,我们不需要指定ForAllOtherMembers选项来映射目标类中的所有剩余属性。