【问题标题】:Automapper - Map one object to another usingdiffrent propertiesAutomapper - 使用不同的属性将一个对象映射到另一个对象
【发布时间】:2018-01-25 19:22:41
【问题描述】:

你能帮帮我吗?我有一个对象

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>>()})

[更新]

也许更好的解决方案是使用反射并编写带有属性 [Attribute(MapType, Order, propertyName)] 的自定义映射器。例如

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

New 遍历属性并使用属性中的类型创建对象。

【问题讨论】:

  • 你可以在你的解析器中设置一个条件(MapFrom 或 ResolveUsing)。
  • 但是我该如何使用它呢?我仍然无法获取 Map>。

标签: automapper


【解决方案1】:

您可以创建两个映射器:

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 -> 映射器 1,实例 2 -> 映射器 2,实例3 -> 映射器 1 ...等)

对于收集部分,您可以轻松调用IEnumerable.Select,将ISourceMapper.Map 方法传递给投影Func&lt;,&gt;

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 1970-01-01
    • 2019-04-27
    • 2017-01-26
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多