📌  相关文章
📜  如何在自动映射器中映射嵌套列表 (1)

📅  最后修改于: 2023-12-03 15:38:41.817000             🧑  作者: Mango

如何在自动映射器中映射嵌套列表

在使用自动映射器(automapper)将一个对象映射到另一个对象时,遇到嵌套列表的情况是非常普遍的。下面是一些方法可以帮助你在自动映射器中映射嵌套列表。

方法一:手动映射

手动映射是最简单的方法。你可以遍历嵌套列表并将每个元素映射到目标对象中。这种方法要求你了解映射的两个对象之间的结构和字段名称。下面是一个手动映射的例子:

public class Source
{
    public List<Item> Items { get; set; }
}

public class Item
{
    public string Name { get; set; }
}

public class Destination
{
    public List<string> ItemNames { get; set; }
}

// 手动映射
var source = new Source
{
    Items = new List<Item>
    {
        new Item { Name = "Item 1" },
        new Item { Name = "Item 2" }
    }
};

var destination = new Destination
{
    ItemNames = new List<string>()
};

foreach (var item in source.Items)
{
    destination.ItemNames.Add(item.Name);
}
方法二:递归映射

如果要映射复杂的对象,手动映射可能会变得非常繁琐。递归映射可以帮助你更高效地完成嵌套列表的映射工作。下面是一个递归映射的例子:

public class RecursiveSource
{
    public List<RecursiveItem> Items { get; set; }
}

public class RecursiveItem
{
    public string Name { get; set; }

    public List<RecursiveItem> ChildItems { get; set; }
}

public class RecursiveDestination
{
    public List<string> ItemNames { get; set; }

    public List<RecursiveDestination> ChildDestinations { get; set; }
}

// 递归映射
var source = new RecursiveSource
{
    Items = new List<RecursiveItem>
    {
        new RecursiveItem 
        { 
            Name = "Item 1", 
            ChildItems = new List<RecursiveItem>
            {
                new RecursiveItem { Name = "Child Item 1" },
                new RecursiveItem { Name = "Child Item 2" }
            }
        },
        new RecursiveItem { Name = "Item 2" }
    }
};

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<RecursiveItem, string>().ForMember(dest => dest, opt => opt.MapFrom(src => src.Name));
    cfg.CreateMap<RecursiveSource, RecursiveDestination>()
        .ForMember(dest => dest.ItemNames, opt => opt.MapFrom(src => src.Items))
        .ForMember(dest => dest.ChildDestinations, opt => opt.MapFrom(src => src.Items.Select(x => Mapper.Map<RecursiveDestination>(x))));
});

var mapper = config.CreateMapper();

var destination = mapper.Map<RecursiveDestination>(source);

在这个例子中,我们使用了 AutoMapper 的 CreateMap() 方法来创建映射配置。这样我们就可以使用 Mapper.Map() 方法将源对象映射到目标对象中。

总结

以上是两种不同的方法来映射嵌套列表。手动映射适用于简单的对象,递归映射适用于复杂的对象。无论你选择哪种方法,都要确保映射的字段名称和类型匹配。