6

派生クラスのコレクションを含むオブジェクトを操作しているときに、AutoMapper 2.1.267.0 で問題に直面しています。次のクラスを使用して、より単純なシナリオで問題を分離しました。

public class ClassABase
{
    public string Name { get; set; }
}

public class ClassA : ClassABase
{
    public string Description { get; set; }
}

public class ClassBBase
{
    public string Title { get; set; }
}

public class ClassB : ClassBBase
{
    public string Text { get; set; }
}

public class ContainerA
{
    public IList<ClassA> ClassAList { get; set; }
    public ClassA ClassA { get; set; }
}

public class ContainerB
{
    public IList<ClassB> ClassBList { get; set; }
    public ClassB ClassB { get; set; }
}

そしてこれらのマッピング

public class ClassABaseToClassBBase : Profile
{
    protected override void Configure()
    {
        CreateMap<ClassABase, ClassBBase>()
            .Include<ClassA, ClassB>()
            .ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Name));

        Mapper.AssertConfigurationIsValid();
    }
}

public class ClassAToClassB : Profile
{
    protected override void Configure()
    {
        CreateMap<ClassA, ClassB>()
            .ForMember(dest => dest.Text, opt => opt.MapFrom(src => src.Description));

        Mapper.AssertConfigurationIsValid();
    }
}

public class ContainerAToContainerB : Profile
{
    protected override void Configure()
    {
        CreateMap<ContainerA, ContainerB>()
            .ForMember(dest => dest.ClassBList,
                       opt => opt.MapFrom(src => Mapper.Map<IList<ClassA>, IList<ClassB>>(src.ClassAList)))
            .ForMember(dest => dest.ClassB, opt => opt.MapFrom(src => src.ClassA));

    }
}

初期化はこちら

Mapper.Initialize(x =>
    {
        x.AddProfile<ClassABaseToClassBBase>();
        x.AddProfile<ClassAToClassB>();
        x.AddProfile<ContainerAToContainerB>();
    });

およびすべてを要約した図 (赤い矢印は AutoMapper マッピングを表します)

ここに画像の説明を入力

ContainerA インスタンスを ContainerB にマップしました。この最初のシナリオは正しく機能します。次の図に示すように、宛先オブジェクトは完全に塗りつぶされています。

ここに画像の説明を入力


しかし、このマッピングを追加すると

public class ClassBBaseToClassB : Profile
{
    protected override void Configure()
    {
        CreateMap<ClassBBase, ClassB>()
            .ForMember(dest => dest.Text, opt => opt.Ignore());

        Mapper.AssertConfigurationIsValid();
    }
}

Mapper.Initialize(x =>
    {
        x.AddProfile<ClassABaseToClassBBase>();
        x.AddProfile<ClassAToClassB>();
        x.AddProfile<ClassBBaseToClassB>();
        x.AddProfile<ContainerAToContainerB>();
    });

ここに画像の説明を入力

結果は

ここに画像の説明を入力

コレクションのすべての要素の「テキスト」プロパティが null になります。画像でわかるように、containerB.ClassB オブジェクトの "Text" プロパティはまだ正しくマップされています。これはコレクションでのみ発生します。何が起こっているのかわかりません。手がかりはありますか?

ありがとう

4

1 に答える 1

1

やあ、

この方法でコンテナ間のマッピングを変更してみてください:

  public class ContainerAToContainerB : Profile
    {
        protected override void Configure()
        {
            CreateMap<ContainerA, ContainerB>()
                .ForMember(dest => dest.ClassBList,opt=>opt.MapFrom(src=>src.ClassAList))
                .ForMember(dest => dest.ClassB, opt => opt.MapFrom(src => src.ClassA));

        }
}
于 2012-09-28T12:19:01.800 に答える