【问题标题】:AutoMapper not working with collection of derived classesAutoMapper 不适用于派生类的集合
【发布时间】:2012-09-11 02:03:28
【问题描述】:

在处理包含派生类集合的对象时,我遇到了 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>();
    });

结果是

集合中所有元素的“文本”属性变为空。正如您在图像中看到的,containerB.ClassB 对象的“Text”属性仍然被正确映射。这只发生在集合中。我不知道发生了什么。有什么线索吗?

谢谢

【问题讨论】:

  • 你期待什么结果?
  • 我希望 containerB.ClassBList 中的所有元素都被完全填充,而不是具有 null 属性。

标签: c# automapper automapper-2


【解决方案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));

        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2014-09-23
    • 1970-01-01
    • 2019-03-03
    • 2011-12-29
    相关资源
    最近更新 更多