映射多个派生类型

Map multiple derived types

我正在尝试映射多种类型,大约 50 种到其他类型(其中 50 种)它们是一对一的,但我想从接口映射到具体类型。

相关代码示例:

using AutoMapper;
using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    internal class Program
    {
        public interface IAnimalBO { }
        public interface IBearBO : IAnimalBO { }
        public interface ITigerBO : IAnimalBO { }

        public static void Main()
        {
            var config = new MapperConfiguration(cfg =>
            {
                // Base class mapping..
                cfg.CreateMap<IAnimalBO, AnimalVM>();  


                cfg.CreateMap<ITigerBO, TigerVM>();
                cfg.CreateMap<IBearBO, BearVM>();
            });

            var mapper = config.CreateMapper();

            // Configure AutoMapper

            var businessObjects = new List<IAnimalBO>
            {
                new TigerBO(),
                new BearBO()
            };

            var results = mapper.Map<IEnumerable<AnimalVM>>(businessObjects);

            foreach (var result in results)
            {
                Console.WriteLine(result.GetType().Name);
            }
            Console.ReadKey();
        }

        public class AnimalVM { }
        public class BearBO : IBearBO { }
        public class BearVM : AnimalVM { }
        public class TigerBO : ITigerBO { }
        public class TigerVM : AnimalVM { }
    }
}

预期的输出应该是:

TigerVM

BearVM

但实际输出是:

AnimalVM

AnimalVM

我不确定如何设置自动映射器来映射这些类型。

如果我推荐基线映射:

                // Base class mapping..
                // cfg.CreateMap<IAnimalBO, AnimalVM>();  

然后我得到以下异常:

Error mapping types.

Mapping types:

List'1 -> IEnumerable'1 System.Collections.Generic.List'1[[ConsoleApplication1.Program+IAnimalBO, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.IEnumerable'1[[ConsoleApplication1.Program+AnimalVM, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

您想使用 include<> 从 class 中选择最派生的映射。

更多信息请见 Mapping Inheritance

var config = new MapperConfiguration(cfg =>
{
    // Base class mapping..
    cfg.CreateMap<IAnimalBO, AnimalVM>()
        .Include<ITigerBO, TigerVM>()
        .Include<IBearBO, BearVM>();
    cfg.CreateMap<ITigerBO, TigerVM>();
    cfg.CreateMap<IBearBO, BearVM>();
});