You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:10:23