为了账号安全,请及时绑定邮箱和手机立即绑定

AutoMapper 覆盖递归类型

AutoMapper 覆盖递归类型

C#
阿晨1998 2021-10-23 17:03:11
我有一个看起来有点像这样的 Dto:class TypeDto{        int Id {get; set;}    string Name {get; set;}    string DisplayName {get; set;}    IEnumerable<TypeDto> Children {get; set;}}现在我需要从两个不同的来源映射到它。那是因为其中一个包含Name,另一个包含DisplayName. 所以类型:class Type1{    int Id {get; set;}    string Name {get; set;}    IEnumerable<Type1> Children {get; set;}}class Type2{    int Id {get; set;}    string DisplayName {get; set;}    IEnumerable<Type2> Nested {get; set;}}注意Children/ Nestedenumerable 中的名称差异。现在对于地图,我会这样做:config.CreateMap<Type1, TypeDto>();config.CreateMap<Type2, TypeDto>()    .ForMember(dest => dest.Children, opts => opts.MapFrom(src => src.Nested));var dto = _mapper.Map<TypeDto>(type1Instance);_mapper.Map(type2Instance, dto);第一个映射按预期工作,递归映射子项,填充Id和Name字段并DisplayName在null任何地方保持相等。然而,第二个映射DisplayName正确地填充了根对象,但随后在其子对象中,它使该Name字段无效。例如:var type1Instance = new Type1 {     Id = 1,     Name = "root",     Children = new[] { new Type1         {            Id = 2,            Name = "child"        }}};var type2Instance = new Type2 {     Id = 1,     DisplayName = "Root",     Children = new[] { new Type2        {            Id = 2,            DisplayName = "Child"        }}};映射以下实例后,结果的字段设置为:Id = 1,Name = "root",DisplayName = "Root",Children = { TypeDto { Id = 2, Name = null, DisplayName = "Child", Children = null } }所以孩子的Name无效,这不是我想要的。我希望它是"child",显然。我应该如何配置映射器以获得想要的行为?我无法更改Type1或Type2类,它们来自外部 API。AutoMapper 的版本是 6.2.1,.NET Framework 4.5.1。
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信