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
- 隐藏的
BaseChild
是null
您可以在下面看到 (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);
我在尝试使用 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
- 隐藏的
BaseChild
是null
您可以在下面看到 (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);