如何使用 automapper 映射它?

How to map this using automapper?

我会先说我刚刚开始使用 AutoMapper。我在理解我尝试做的事情是否不正确时遇到了一些问题。

我有一个摘要class。

 public abstract class Animal
    {
        public int Age { get; set; }
    }

我有一个 class 派生自这个摘要 class

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

        public string Type { get; set; }
    }

我有一个单独的 class,它共享需要映射到从 Animal 抽象 class 派生的 Cat class 的值。

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

我有一个像这样的映射器设置,

Mapper.CreateMap<ProblemClass, Animal>();

我已经实例化了一个 ProblemClass 项。

var problemClass = new ProblemClass();
Mapper.Map<Animal>(problemClass);

我该如何绘制这样的地图?我的主要困惑是 automapper 显然不能实例化一个抽象 class,所以我真的很困惑如何为 Animal 创建一个通用的 Mapper,它适用于从它派生的各种动物子 classes .

一个可能的解决方案是自动创建源类型和所有派生目标类型之间的映射:

using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        public abstract class Animal
        {
            public int Age { get; set; }
        }

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

            public string Type { get; set; }
        }

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

        private static IList<Type> GetAllDerivedTypes(Type t)
        {
            var listOfBs = (from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
                            from assemblyType in domainAssembly.GetTypes()
                            where t.IsAssignableFrom(assemblyType)
                            select assemblyType);
            return listOfBs.ToList();
        }

        private static void MapAllTypes(Type srcType, Type destType)
        {
            var allDestTypes = GetAllDerivedTypes(destType);
            foreach (var destTypeDerived in allDestTypes)
            {
                Mapper.CreateMap(srcType, destTypeDerived);
            }
        }

        static void Main(string[] args)
        {
            MapAllTypes(typeof(ProblemClass), typeof(Animal));

            var problemClass = new ProblemClass() { Name = "test name" };
            Animal someAnimal = new Cat();

            // after this (someAnimal as Cat).Name will be "test name"
            Mapper.Map(problemClass, someAnimal);
        }
    }
}