【问题标题】:automapper multi objects to one object将多个对象自动映射到一个对象
【发布时间】:2012-09-14 17:22:31
【问题描述】:

我有两个子类,我需要将 List 元素复制到主对象中

public Class Foo1 : Anote
{
  public bool Ison { get; set;}
  public List<Anote>Anotes { get; private set;}

  public Foo1()
  {
    this.Anotes = new List<Anote>();
  }
}

public Class Foo2 : Bnote
{
  public bool Ison { get; set;}
  public List<Bnote>Anotes { get; private set;}

  public Foo2()
  {
    this.Anotes = new List<Bnote>();
  }
}

public Class Foo3 : Cnote
{
   public bool Ison { get; set;}
   public List<Cnote>Anotes { get; private set;}
   public List<Cnote>Bnotes { get; private set; }

}

我将从数据库中检索数据并将这些数据放入 Foo1 和 Foo2。然后我需要 将 Foo1 和 Foo2 中的 List 数据映射到 Foo3 中的 List 元素中。

我已经完成了

Foo1A foo1a = new Foo1A();
Foo2A foo2a = new Foo2A();

Mapper.CreateMap<Foo1, Foo1A>();
Mapper.CreateMap<Foo2, Foo2A>();
Mapper.Map<Foo1, Foo2A>(foo1, foo1a);
Mapper.Map<Foo2, Foo2A>(foo2, foo2a);

这行得通,但我需要做的是

将 Foo1 中的 List Anotes 映射到 Foo3 中的 List Anotes 将 Foo2 中的 List Anotes 映射到 Foo3 中的 List Bnotes。

【问题讨论】:

标签: c# automapper


【解决方案1】:

你应该能够做到:

Mapper.CreateMap<ANote, CNote>();

Mapper.CreateMap<Foo1, Foo3>()
    .ForMember(dest => dest.ANotes, opt => opt.MapFrom(src => src.ANotes))
    .ForMember(dest => dest.BNotes, opt => opt.Ignore());

Mapper.CreateMap<Foo2, Foo3>()
    .ForMember(dest => dest.BNotes, opt => opt.MapFrom(src => src.ANotes))
    .ForMember(dest => dest.ANotes, opt => opt.Ignore());

Foo3 foo3 = new Foo3();

Mapper.Map<Foo1, Foo3>(foo, foo3);
Mapper.Map<Foo2, Foo3>(foo2, foo3);

foo3.ANotesfoo3.BNotes 应该都已正确映射。

【讨论】:

  • 对于其他偶然发现此问题的人,我一直在尝试使用此解决方案来合并两个对象列表。我一直无法弄清楚如何让它发挥作用。我必须使用 foreach,然后映射每个项目并手动将其添加到列表中。
  • @Icestorm0141:你有新问题要解决吗?
  • 在第二个映射 Foo2 到 Foo3 中,即 .ForMember(dest =&gt; dest.BNotes, opt =&gt; opt.MapFrom(src =&gt; src.ANotes)) 不应该是 be src,BNotes 而不是 src.ANotes
  • 这个解决方案的问题是你复制了 Foo1 和 Foo2 的映射。如果您有复杂的映射,复制那么多是代码味道。我希望 Automapper 有办法做到这一点:Mapper.CreateMap&lt;Src1, Src2, Dest3&gt;(); 与 OP 一样,Src1 和 Src2 在结构上几乎相同。
  • 在本例中,您将列表写入两个不同的列表,如果您想将它们全部写入 Foo3 中的同一个列表怎么办? see
【解决方案2】:

对于我的情况,接受的答案感觉不是一个可以接受的解决方案。昨晚睡着了,突然想到:

假设您想将Foo1Foo2 这两个类映射到Foo3

public Class Foo1 : Anote
{
  public bool Ison { get; set;}
  public List<Anote>Anotes { get; private set;}

  public Foo1()
  {
    this.Anotes = new List<Anote>();
  }
}

+

public Class Foo2 : Bnote
{
  public bool Ison { get; set;}
  public List<Bnote>Anotes { get; private set;}

  public Foo2()
  {
    this.Anotes = new List<Bnote>();
  }
}

=

public Class Foo3 : Cnote
{
   public bool Ison { get; set;}
   public List<Cnote>Anotes { get; private set;}
   public List<Cnote>Bnotes { get; private set; }

}

您真正需要的是另一个用于 Automapper 目的的包装类。

public class Foo1And2 {
    public Foo1 Foo1 {get;set;}
    public Foo2 Foo2 {get;set;}
}

然后定义映射:

CreateMap<Foo1And2, Foo3>().ConvertUsing(x => ConvertFoo1And2ToFoo3(x));
public Foo3 ConvertFoo1And2ToFoo3(Foo1And2 foo1And2)
{
    return new Foo3
    {
        Ison = foo1And2.Foo1.Ison && foo1And2.Foo2.Ison,
        Anotes = foo1And2.Foo1.Anotes,
        Bnotes = foo1And2.Foo2.Bnotes,
    };
}

并使用它

var foo3 = Map<Foo3>(new Foo1And2
{
    Foo1 = foo1,
    Foo2 = foo2,
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2018-08-30
    相关资源
    最近更新 更多