簡體   English   中英

automapper 多對象到一個對象

[英]automapper multi objects to one object

我有兩個子類,我需要將 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 中的列表注釋映射到 Foo3 中的列表注釋 將 Foo2 中的列表注釋映射到 Foo3 中的列表注釋。

你應該能夠做到:

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都應該被正確映射。

接受的答案對於我的情況來說並不是一個可以接受的解決方案。 我昨晚睡着了,有這樣的想法:

假設您想將兩個類Foo1Foo2Foo3

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM