AutoMapper - 映射子 属性 隐藏基础 class 属性

AutoMapper - Map child property hiding base class property

我在尝试使用 AutoMapper 和 C# 将 class 映射到派生的 class 时遇到了一个非常愚蠢的问题。

这些是我的 classes:

class BaseParent {
    public string Name { get; set; }
    public BaseChild Child { get; set; }
}

class BaseChild {
    public int Age { get; set; }
}

class DerivedParent : BaseParent {
    public new DerivedChild Child { get; set; }
}

class DerivedChild : BaseChild { }

特别是,我要实现的是正确设置映射 class 的所有属性。问题是映射 class 的 Child 属性 未设置并保持 null.

这是我正在使用的映射配置:

var config = new MapperConfiguration(cfg => {
        cfg.CreateMap<BaseChild, DerivedChild>();
        cfg.CreateMap<BaseParent, DerivedParent>()
            .ForMember(dest => dest.Child, opt => opt.MapFrom(src => src.Child));
    });

感谢任何帮助。

谢谢

编辑

实际上说 Child 属性 仍然是 null 是不正确的。 调试代码我可以看到有 2 个子属性具有相同的名称,因为 new 修饰符用于隐藏父属性。

反正我需要的属性还是null.

你确定你没看错吗?

给定以下配置:

// Arrange
var mapper = new Mapper(new MapperConfiguration(cfg => {
    cfg.CreateMap<BaseChild, DerivedChild>();
    cfg.CreateMap<BaseParent, DerivedParent>()
        .ForMember(dest => dest.Child, opt => opt.MapFrom(src => src.Child));
}));
var baseParent = new BaseParent { Name = "A", Child = new BaseChild { Age = 1 } };

// Act
var derived = mapper.Map<DerivedParent>(baseParent);

我可以向你保证:

  • derived.Child当然是not null
  • 类型为DerivedChild
  • 隐藏的BaseChildnull

您可以在下面看到 (see working Fiddle):

// Assert
Assert.IsNotNull(derived);
Assert.IsInstanceOf<DerivedParent>(derived);

// The 'new' Child property is not null
Assert.IsNotNull(derived.Child);
Assert.IsInstanceOf<DerivedChild>(derived.Child);

// The hidden property should be null
Assert.IsNull(((BaseParent)derived).Child);