Mapster能否适配只读集合?映射含只读集合类的疑问
使用Mapster映射到含只读集合的Componente类
完全可行,Mapster支持自定义映射逻辑来适配这种只能通过方法操作集合的场景,具体可以通过AfterMapping回调来实现:
核心思路
由于Componente类的PreciosHistorico是只读集合,无法直接赋值,我们可以在Mapster完成基础属性映射后,手动调用类的AddPrecioHistorico方法填充集合;如果是更新现有实例,还可先调用RemovePrecioHistorico清空原有项。
示例实现
假设你的源DTO类结构如下:
public class ComponenteDto { public long Id { get; set; } public List<PrecioHistorico> PreciosHistorico { get; set; } }
1. 配置Mapster映射规则
// 全局配置(也可在映射时单独配置) TypeAdapterConfig<ComponenteDto, Componente>.NewConfig() // 映射基础属性 .Map(dest => dest.Id, src => src.Id) // 映射完成后处理集合 .AfterMapping((src, dest) => { // 若要替换现有集合,先清空原有项(可选,依业务需求而定) foreach (var existingPrecio in dest.PreciosHistorico.ToList()) { dest.RemovePrecioHistorico(existingPrecio); } // 添加源对象中的所有历史价格项 foreach (var precio in src.PreciosHistorico) { dest.AddPrecioHistorico(precio); } });
2. 执行映射
// 从DTO映射到新的Componente实例 var componenteDto = new ComponenteDto { Id = 123, PreciosHistorico = new List<PrecioHistorico> { new PrecioHistorico(), ... } }; var componente = componenteDto.Adapt<Componente>(); // 或者更新现有Componente实例 var existingComponente = new Componente(123); componenteDto.Adapt(existingComponente);
注意事项
- 若不需要替换原有集合,仅追加项,可去掉清空原有项的逻辑
- 确保
PrecioHistorico类已配置正确的映射规则(如需映射该类内部属性)
内容的提问来源于stack exchange,提问作者Álvaro García
相关产品推荐
相关产品推荐

