如何使用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
相关产品推荐
相关产品推荐

