【问题标题】:AutoMapper - Map child property hiding base class propertyAutoMapper - 映射子属性隐藏基类属性
【发布时间】:2021-02-27 00:17:42
【问题描述】:

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

这些是我的课程:

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 { }

特别是,我想要实现的是正确设置映射类的所有属性。问题是映射类的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

【问题讨论】:

    标签: c# inheritance automapper parent-child member-hiding


    【解决方案1】:

    你确定你没看错吗?

    给定以下配置:

    // 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);
    

    【讨论】:

    • 其实你是对的。我在 LinqPad 上测试这种情况,这就是我所看到的:pasteboard.co/JAALOHB.png.
    • 你提到 LinqPad 很有趣,因为这是我第一次尝试的,看到了你所看到的。这导致我进一步调查,包括转储execution plan - 这绝对看起来应该有效。我说这可能是 LinqPad 的问题。
    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多