AutoMapper映射含字典属性的类时如何配置ForMember转换字典值类型
方案1:直接配置ForMember完成单次转换
直接在你现有的映射配置后追加ForMember逻辑即可,clothname属性名称和类型完全匹配,AutoMapper会自动完成映射无需额外配置:
var config = new MapperConfiguration(cfg => { cfg.CreateMap<clothdata, clothdataview>() .ForMember(dest => dest.textilenode, opt => opt.MapFrom(src => // 处理源字典为null的情况,避免空引用异常 src.textilenode == null ? null : src.textilenode.ToDictionary(kv => kv.Key, kv => kv.Value.ToString()) )); });
如果需要源为null时返回空字典而非null,把三元表达式中的null替换为new Dictionary<string, string>()即可。
方案2:注册通用转换器适配后续扩展需求
如果后续经常需要做不同值类型的字典转换,可以定义通用类型转换器,避免每次重复写转换逻辑:
- 首先定义通用字典值转换器
using AutoMapper; public class DictionaryValueConverter<TSourceValue, TDestValue> : ITypeConverter<Dictionary<string, TSourceValue>, Dictionary<string, TDestValue>> { public Dictionary<string, TDestValue> Convert(Dictionary<string, TSourceValue> source, Dictionary<string, TDestValue> destination, ResolutionContext context) { if (source == null) return null; return source.ToDictionary( kv => kv.Key, kv => (TDestValue)Convert.ChangeType(kv.Value, typeof(TDestValue)) ); } }
- 映射配置中注册转换器即可,无需再单独配置textilenode属性
var config = new MapperConfiguration(cfg => { // 注册int转string的字典转换器 cfg.CreateMap<Dictionary<string, int>, Dictionary<string, string>>() .ConvertUsing(new DictionaryValueConverter<int, string>()); // 类映射无需额外配置字段,AutoMapper会自动匹配属性并调用对应转换器 cfg.CreateMap<clothdata, clothdataview>(); });
后续需要转换其他值类型的字典时,仅需新增一行转换器注册逻辑即可,无需修改现有类的映射配置。
注:目标类上的[JsonPropertyName]特性是JSON序列化阶段的配置,不影响AutoMapper的属性映射逻辑,只要类的属性名匹配即可自动映射。
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

