C# AutoMapper中如何一次性反向映射显式配置的多个实体成员
解决方案
你不需要为每个ForMember单独添加ReverseMap,正确的写法是所有正向映射规则配置完成后,在链式调用末尾仅调用一次ReverseMap()即可完成全局反向映射的基础配置,完全不会出现你担心的成员配置的源和目标频繁互换的问题。
- 字段名、类型完全匹配的属性(比如你代码中的
SSN、Address),反向映射会自动生效,不需要额外配置。 - 正向用到自定义
MapFrom的特殊映射规则(比如嵌套对象取值、类型强转、方法返回值映射),需要在ReverseMap()之后补充对应反向规则,嵌套对象赋值可以用ForPath方法处理。
示例代码如下:
// 先完整配置 Source -> Destination 的所有正向规则 CreateMap<Source, Destination>() .ForMember(dest => dest.FirstName, map => map.MapFrom(src => src.Name.First)) .ForMember(dest => dest.LastName, map => map.MapFrom(src => src.Name.Last)) .ForMember(dest => dest.SSN, map => map.MapFrom(src => src.SSN)) .ForMember(dest => dest.HomePhoneNo, map => map.MapFrom(src => src.HomePhoneNumber())) .ForMember(dest => dest.Address, map => map.MapFrom(src => src.Address)) .ForMember(dest => dest.MaritalStatus, map => map.MapFrom(src => (int)src.MaritalStatus)) // 所有正向规则写完后仅加一次 ReverseMap,开启 Destination -> Source 的反向映射 .ReverseMap() // 下方配置均为 Destination -> Source 的反向自定义规则 .ForPath(dest => dest.Name.First, map => map.MapFrom(src => src.FirstName)) .ForPath(dest => dest.Name.Last, map => map.MapFrom(src => src.LastName)) .ForMember(dest => dest.MaritalStatus, map => map.MapFrom(src => (YourMaritalStatusEnum)src.MaritalStatus)) // 假设 Source 中存储手机号的字段为 HomePhone,反向直接赋值即可 .ForMember(dest => dest.HomePhone, map => map.MapFrom(src => src.HomePhoneNo));
如果你使用的是AutoMapper 10及以上版本,上述写法完全兼容,不需要额外做其他配置。
内容的提问来源于stack exchange,提问作者Joy
相关产品推荐
相关产品推荐

