class Source{
public string A {get;set;}
public string B {get;set;}
public string C {get;set;}
public string D {get;set;}
}
目标对象
class Dest{
public string A1 {get;set;}
public string B1 {get;set;}
}
是否可以使用Automapper从源对象创建Dest对象,但是Dest的第一个实例是映射A到A1和B到B1,在Dest映射C到A1和D到B1的第二个实例中?
在做梦的解决方案中获得收藏?
类似的东西:
Mapper.Initialize(cfg =>{
cfg.CreateMap<Source, Dest>()
.ForMember(dest => dest.A1, opt => opt.MapFrom(src => src.A))
.ForMember(dest => dest.B1, opt => opt.MapFrom(src => src.B;))
cfg.CreateMap<Source, Dest>()
.ForMember(dest => dest.A1, opt => opt.MapFrom(src => src.C))
.ForMember(dest => dest.B1, opt => opt.MapFrom(src => src.D))});
或者:
Mapper.Initialize(cfg =>{
cfg.CreateMap<Source, ICollection<Dest>>()})
[UPDATE]
也许更好的解决方案是使用反射和编写自定义映射器,使用属性[Attribute(MapType,Order,propertyName)]。 E.g
class Source{
[Dest(Dest,1,"A1")]
public string A {get;set;}
[Dest(Dest,1,"B1")]
public string B {get;set;}
[Dest(Dest,2,"A1")]
public string C {get;set;}
[Dest(Dest,2,"B1")]
public string D {get;set;}
}
新的浏览属性并使用属性类型创建对象。
答案 0 :(得分:2)
您可以创建两个映射器:
var m1 = new MapperConfiguration(
cfg =>
{
cfg.CreateMap<Source, Dest>()
.ForMember(dest => dest.A1, opt => opt.MapFrom(src => src.A))
.ForMember(dest => dest.B1, opt => opt.MapFrom(src => src.B));
})
.CreateMapper();
var m2 = new MapperConfiguration(
cfg =>
{
cfg.CreateMap<Source, Dest>()
.ForMember(dest => dest.A1, opt => opt.MapFrom(src => src.C))
.ForMember(dest => dest.B1, opt => opt.MapFrom(src => src.D));
})
.CreateMapper();
然后在另一个接口(你定义的)后面使用它们(例如ISourceMapper),它将根据实例的数量在两个映射器之间交替(即实例1 - &gt; mapper 1,实例2 - &gt; mapper 2 ,实例3 - &gt; mapper 1 ...等。)
对于收藏部分,您可以轻松地将IEnumerable.Select
传递ISourceMapper.Map
方法调用投影Func<,>
。