自动映射 - 使用不同的属性将一个对象映射到另一个对象

时间:2018-01-25 19:22:42

标签: automapper

你可以帮我吗?我有一个对象

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

新的浏览属性并使用属性类型创建对象。

1 个答案:

答案 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<,>