结构差异极大的实体能否借助实体映射库实现属性映射?
绝对没问题!你提到的AutoMapper、AgileMapper和Mapster这些映射库,本质上就是为了解放手动写映射代码的麻烦——不管实体结构差异多大,只要你能明确映射规则,它们都能搞定。
先贴一下你的实体定义方便参考:
public class EntityA { public int PropertyA; } public class EntityB { public Inner1 inner1; } public class Inner1 { public Inner2 inner2; } public class Inner2 { public double nothingLikeTheOtherPropName; }
下面分别用三个库演示如何实现EntityA.PropertyA到Inner2.nothingLikeTheOtherPropName的映射:
AutoMapper 实现
AutoMapper通过CreateMap搭配ForMember来指定自定义的嵌套映射路径,配置非常直观:
// 初始化映射配置 var mapperConfig = new MapperConfiguration(cfg => { cfg.CreateMap<EntityA, EntityB>() .ForMember( dest => dest.inner1.inner2.nothingLikeTheOtherPropName, opt => opt.MapFrom(src => src.PropertyA) ); }); // 创建映射器实例 var mapper = mapperConfig.CreateMapper(); // 执行映射 var entityA = new EntityA { PropertyA = 42 }; var entityB = mapper.Map<EntityB>(entityA); // 结果:entityB.inner1.inner2.nothingLikeTheOtherPropName = 42.0
Mapster 实现
Mapster的语法更简洁,而且会自动帮你初始化嵌套的Inner1和Inner2实例,不用手动创建:
// 配置映射规则 TypeAdapterConfig<EntityA, EntityB>.NewConfig() .Map( dest => dest.inner1.inner2.nothingLikeTheOtherPropName, src => src.PropertyA ); // 执行映射 var entityA = new EntityA { PropertyA = 42 }; var entityB = entityA.Adapt<EntityB>();
AgileMapper 实现
AgileMapper同样支持灵活的自定义映射,写法也很清晰:
// 创建映射器 var mapper = Mapper.CreateNew(); // 执行映射并指定规则 var entityA = new EntityA { PropertyA = 42 }; var entityB = mapper.Map(entityA).ToANew<EntityB>(cfg => cfg .Map(src => src.PropertyA) .To(dest => dest.inner1.inner2.nothingLikeTheOtherPropName) );
总结
这些库的核心能力远不止处理结构相似的实体——自定义映射规则才是它们解决复杂场景的关键。哪怕你的实体嵌套层级更深、属性名差异更大,只要能明确“从哪来,到哪去”,都能通过简单的配置实现映射,完全不用手动写一堆new Inner1 { inner2 = new Inner2 { ... } }的重复代码。
内容的提问来源于stack exchange,提问作者Amit Toren
相关产品推荐
相关产品推荐

