使用AutoMapper的IValueConverter时ReverseMap反向映射问题求助
AutoMapper双向映射自定义值转换器实现
问题分析
正向从ParentA映射到ParentB可正常运行,但反向ParentB→ParentA时失败,原因是自定义值转换器IntConverter仅实现了string→int的转换逻辑,未完成反向int→string的转换,且未实现对应的IValueConverter<int, string>接口。
解决方案
1. 修改值转换器,实现双向转换接口
让IntConverter同时实现IValueConverter<string, int>和IValueConverter<int, string>两个接口,补全反向转换的逻辑:
public class IntConverter : IValueConverter<string, int>, IValueConverter<int, string> { // 正向转换:ParentA.isActive(string) → ParentB.Value(int) public int Convert(string sourceMember, ResolutionContext context) { return sourceMember switch { "Y" => 100, "N" => 200, "P" => 500, _ => 1000 }; } // 反向转换:ParentB.Value(int) → ParentA.isActive(string) public string Convert(int sourceMember, ResolutionContext context) { return sourceMember switch { 100 => "Y", 200 => "N", 500 => "P", _ => "Y" // 可根据业务需求调整默认值,比如改为"Unknown" }; } }
2. 配置反向映射的属性特性
AutoMapper的ReverseMap=true不会自动反转属性上的SourceMember和ValueConverter配置,需在ParentA的isActive属性上添加对应的映射特性,确保反向映射时能匹配正确的源字段和转换器:
public class ParentA { public int Id { get; set; } public string Name { get; set; } [ValueConverter(typeof(IntConverter))] [SourceMember("Value")] public string isActive { get; set; } } [AutoMap(typeof(ParentA), ReverseMap = true)] public class ParentB { public int Id { get; set; } public string Name { get; set; } [ValueConverter(typeof(IntConverter))] [SourceMember("isActive")] public int Value { get; set; } }
3. 测试验证
修改后执行测试代码即可完成双向映射:
ParentA ssssssss = new ParentA { Id = 1, isActive = "Y", Name = "test" }; var response = automapper.Map<ParentB>(ssssssss); response.Value = 500; var yyyy = automapper.Map<ParentA>(response); // yyyy.isActive 会被正确映射为 "P"
内容的提问来源于stack exchange,提问作者Jishnu Chandran
相关产品推荐
相关产品推荐

