1

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

这些是我的课:

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

4

1 回答 1

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
  • 隐藏BaseChild的是null

您可以在下面看到(请参阅工作小提琴):

// 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);
于 2020-11-16T01:35:16.523 回答