AutoMapper 将字符串集合映射到对象集合中的对象属性

问题描述 投票:0回答:1

我正在尝试将包含可枚举字符串集合的对象映射到包含可枚举集合对象的对象,该对象的属性包含这些集合中的数据。

考虑以下源类:

class Source
{
    public IEnumerable<string> Makes { get; set; }
    public IEnumerable<string> Models { get; set; }
    public IEnumerable<string> Variants { get; set; }
}

以及以下目的地类别:

class Destination
{
    public IEnumerable<Vehicle> Vehicles { get; set; }
}

class Vehicle
{
    public string Makes { get; set; }
    public string Models { get; set; }
    public string Variants { get; set; }
}

我想将

Source
映射到
Destination
,使用每个
Source
集合值的位置来映射到新
Vehicle
的属性,并将其添加到
Destination.Vehicles
集合中。因此,如果每个
Source
集合包含 20 个项目,我希望
Destination.Vehicles
集合包含 20 个
Vehicle
项目。

我尝试了以下配置,但它无法解决开箱即用的问题:

    CreateMap<Source, Destination>();
    CreateMap<Source, Vehicle>();

然后,我继续尝试在此回复中针对有关展平嵌套数组的问题给出的建议,但很快就超出了我的理解范围。

任何帮助将不胜感激。

谢谢

c# arrays automapper enumerable
1个回答
0
投票

正如@madreflection 在评论中提到的,您可以使用 Enumerable.Zip()

 实现 
自定义转换器 来合并这 3 个数组。

CreateMap<Source, Destination>()
    .ConvertUsing((src, dst) =>
    {
        dst = new Destination();
                    
        dst.Vehicles = src.Makes
            .Zip(src.Models, src.Variants)
            .Select(x => new Vehicle
            {
                Makes = x.Item1,
                Models = x.Item2,
                Variants = x.Item3
            })
            .ToList();
                    
            return dst;
});

如果您的.NET版本不支持具有三个参数的

Enumerable.Zip()
,那么您必须实现如下合并数组:

int maxElement = new int[] { src.Makes.Count(), src.Models.Count(), src.Variants.Count() }
    .Max();
                    
var vehicles = new List<Vehicle>();
for (int i = 0; i < maxElement; i++)
{
    vehicles.Add(new Vehicle
        {
            Makes = src.Makes.ElementAtOrDefault(i),
            Models = src.Models.ElementAtOrDefault(i),
            Variants = src.Variants.ElementAtOrDefault(i)
        });
}
dst.Vehicles = vehicles;
© www.soinside.com 2019 - 2024. All rights reserved.