说我有
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
的其他属性将为空白,因为没有什么可地图。
如何设置配置以执行此映射?
答案 0 :(得分:0)
您需要ForMember
,MapFrom
和ForAllOtherMembers
的组合:
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
选项来映射目标类中的所有剩余属性。