如何使用Mapster将类层次结构映射为扁平化DTO
解决Mapster多态映射问题
要让派生类的属性也能正确映射到DTO,需要给每个派生类单独配置映射规则,并将这些规则关联到基类的映射配置中,具体步骤如下:
1. 配置派生类到DTO的映射
分别为Motor和Battery配置到DeviceDto的映射,确保派生类的属性能被正确映射:
// 配置Motor到DeviceDto的映射 TypeAdapterConfig.NewConfig<Motor, DeviceDto>() .Map(dest => dest.SerialCode, src => src.SerialCode); // 配置Battery到DeviceDto的映射 TypeAdapterConfig.NewConfig<Battery, DeviceDto>() .Map(dest => dest.Capacity, src => src.Capacity);
2. 在基类映射中包含派生类配置
将上述派生类的映射规则关联到Device基类的映射配置里,这样Mapster在处理基类实例时,会自动识别实际的派生类型并使用对应的映射规则:
TypeAdapterConfig.NewConfig<Device, DeviceDto>() .Include<Motor, DeviceDto>() .Include<Battery, DeviceDto>();
3. 执行映射
之后再执行原有的映射代码,就能同时映射基类和派生类的属性了:
List<Device> devices = GetDevices(); var dtos = devices.Adapt<List<DeviceDto>>();
原理说明
默认情况下,Mapster只会按照基类的属性定义进行映射,不会自动识别并处理派生类的扩展属性。通过显式配置每个派生类的映射规则,并使用Include方法将其关联到基类配置,Mapster就能在运行时根据实例的实际类型,选择对应的派生类映射规则,完成完整的属性映射。
内容的提问来源于stack exchange,提问作者Luka
相关产品推荐
相关产品推荐

