如何使用automapper进行映射?

时间:2015-12-15 20:15:42

标签: c# automapper

我会说我刚刚开始使用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);

我如何映射这样的东西?我的主要困惑是autpper显然无法实例化一个抽象类,所以我真的很困惑如何为Animal创建一个通用的Mapper,它适用于从它派生的各种动物子类。

1 个答案:

答案 0 :(得分:1)

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

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