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

如何使用AutoMapper将PropertiesModel映射为ICollection<IdValue>集合

这个映射需求完全可以通过AutoMapper实现,你之前的配置错误原因是:ForMember 方法用于配置目标类型单个属性的映射规则,而你的目标类型是完整的集合ICollection<IdValue>,重复对集合本身配置ForMember只会不断覆盖之前的规则,无法得到预期结果。

正确的实现可以用AutoMapper的ConvertUsing方法自定义整个类型的转换逻辑,有两种常用实现方式:

方案1:通用反射实现(无需逐个配置属性)

适合属性数量多、后续可能新增属性的场景,新增PropertiesModel的decimal属性时不需要修改映射配置:

using System.Reflection;
using System.Linq;

// AutoMapper配置
CreateMap<PropertiesModel, ICollection<IdValue>>()
    .ConvertUsing(model => 
    {
        // 筛选所有public的decimal类型实例属性
        var decimalProperties = typeof(PropertiesModel)
            .GetProperties(BindingFlags.Public | BindingFlags.Instance)
            .Where(p => p.PropertyType == typeof(decimal));
        
        // 生成IdValue集合
        return decimalProperties.Select(p => new IdValue
        {
            Id = p.Name,
            Value = (decimal)p.GetValue(model)
        }).ToList();
    });

方案2:硬编码实现(性能更高)

避免反射开销,适合对性能要求高、属性变动频率低的场景,使用nameof避免硬编码属性名字符串出错:

// AutoMapper配置
CreateMap<PropertiesModel, ICollection<IdValue>>()
    .ConvertUsing(model => new List<IdValue>
    {
        new IdValue { Id = nameof(model.property1), Value = model.property1 },
        new IdValue { Id = nameof(model.property2), Value = model.property2 },
        // ... 其余属性依次添加
        new IdValue { Id = nameof(model.propertyz), Value = model.propertyz }
    });

调用方式

配置完成后直接正常调用AutoMapper即可,需要数组类型的话可以直接映射为IdValue[]:

// 示例调用
PropertiesModel input = new PropertiesModel { property1 = 10.5m, property2 = 20.3m };
// 映射为集合
ICollection<IdValue> collectionResult = mapper.Map<ICollection<IdValue>>(input);
// 映射为数组
IdValue[] arrayResult = mapper.Map<IdValue[]>(input);

内容的提问来源于stack exchange,提问作者Ragmar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 09:42:01