如何使用automapper对此进行映射

本文关键字:映射 何使用 automapper | 更新日期: 2023-09-27 18:26:52

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

我有一节抽象课。

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

我有一个派生自这个抽象类的类

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

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

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

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

Mapper.CreateMap<ProblemClass, Animal>();

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

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

我该如何绘制这样的东西?我最困惑的一点是,automapper显然无法实例化抽象类,所以我真的很困惑如何为Animal创建一个通用的Mapper,它可以与从中派生的各种动物子类一起工作

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

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);
        }
    }
}

如何使用automapper对此进行映射