Automapper:将多个源数组自定义映射到单个目标数组

Automapper: Custom mapping for multiple source arrays to a single destination array

我有一个源 dto 对象被映射到一个配置对象。我的 Source 对象 (ConfigDto) 有几个不同类型的数组: '''

public class ConfigDto
{
    public DogDto[] Dogs { get; set; }
    public CatDto[] Cats { get; set; }
}

public class DogDto
{
    public string Name { get; set; }
}
public class CatDto
{
    public string Name { get; set; }
}

''' Config 对象具有实现接口 (IAnimal) 的单个对象数组:

'''

public interface IAnimal
{
    string Name { get; set; }
    void MakeSound();
}

public class Dog : IAnimal
{
    public string Name { get; set; }

    public void MakeSound()
    {
        System.Diagnostics.Debug.WriteLine("Bark!");
    }
}

public class Cat : IAnimal
{
    public string Name { get; set; }

    public void MakeSound()
    {
        System.Diagnostics.Debug.WriteLine("Meow!");
    }
}


public class AnimalConfig
{
    public IAnimal[] Animals { get; set; }
}

''' 有没有更好的方法将 DTO 映射到配置对象。我正在使用自定义类型转换器并通过源数组旋转以创建单个目标数组,但感觉应该有一种方法可以将 CatDto 映射到 Cat 并将 DogDto 映射到狗。 注意:由于各种原因,我无法更改源对象和目标对象的结构。

'''

public class AnimalConverter : ITypeConverter<ConfigDto, AnimalConfig>
{
    public AnimalConfig Convert(ConfigDto source, AnimalConfig destination, ResolutionContext context)
    {
        List<IAnimal> destAnimals = new List<IAnimal>();

        foreach (var catDto in source.Cats)
        {
            destAnimals.Add(new Cat() { Name = catDto.Name }); //I am manually converting Cat. Could this be done via Automapper? 
        }

        foreach (var dogDto in source.Dogs)
        {
            destAnimals.Add(new Dog() { Name = dogDto.Name });  //I am manually converting Dog. Could this be done via Automapper? 
        }

        return new AnimalConfig(){Animals = destAnimals.ToArray()};
    }
}

'''

在您的自动映射器上配置文件配置 添加以下内容

CreateMap<CatDto, Cat>();
CreateMap<DogDto, Dog>();

在自定义映射器上

public class AnimalConverter : ITypeConverter<ConfigDto, AnimalConfig>
{
    public AnimalConfig Convert(ConfigDto source, AnimalConfig destination, ResolutionContext context)
    {
        List<IAnimal> destAnimals = new List<IAnimal>();
        
        //add cats
        destAnimals.AddRange(context.Mapper.Map<List<Cat>>(source.Cats));

        //add dogs
        destAnimals.AddRange(context.Mapper.Map<List<Dog>>(source.Dogs));

        return new AnimalConfig(){Animals = destAnimals.ToArray()};
    }
}