8

List要素をマスターオブジェクトにコピーする必要がある2つのサブクラスがあります

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のリストデータをFoo3のリスト要素にマップする必要があります。

私はやった

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のリストAnotesをFoo3のリストAnotesにマップします。Foo2のリストAnotesをFoo3のリストBnotesにマップします。

4

2 に答える 2

11

あなたはただできるはずです:

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両方が正しくマッピングされている必要があります。

于 2012-09-15T00:27:10.443 に答える
0

受け入れられた答えは、私の状況にとって受け入れられる解決策のようには感じませんでした。私は昨夜眠りに落ちていて、この考えを持っていました:

2つのクラスをマップしたいとしFoo1ますFoo2Foo3

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,
});
于 2020-05-30T18:30:09.460 に答える