猿问

AutoMapper 覆盖递归类型

我有一个看起来有点像这样的 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。


阿晨1998
浏览 141回答 2
2回答
随时随地看视频慕课网APP
我要回答