如何使用AutoMapper将多个子类映射到一个类中? [英] How do I use AutoMapper to map multiple subclasses into one class?

查看:429
本文介绍了如何使用AutoMapper将多个子类映射到一个类中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有三个类,它们是基类的子类:

Let's assume I have three classes that are subclasses of a base class:

public class BaseClass
{
    public string BaseName { get; set; }
}

public class Subclass1 : BaseClass
{
    public string SubName1 { get; set; }
}

public class Subclass2 : BaseClass
{
    public string SubName2 { get; set; }
}

public class Subclass3 : BaseClass
{
    public string SubName3 { get; set; }
}

我想将它们映射到如下所示的ViewModel类:

I would like to map these to a ViewModel class that looks like this:

public class ViewModel
{
    public string BaseName { get; set; }
    public string SubName1 { get; set; }
    public string SubName2 { get; set; }
    public string SubName3 { get; set; }
}

ViewModel简单地组合所有子类的属性并将其展平.我试图像这样配置映射:

ViewModel simply combines the properties on all of the subclasses and flattens it. I tried to configure the mapping like so:

AutoMapper.CreateMap<BaseClass, ViewModel>();

然后我尝试像这样从数据库中获取数据:

Then I tried grabbing data from my database like so:

var items = Repo.GetAll<BaseClass>();
AutoMapper.Map(items, new List<ViewModel>());

但是,最终发生的是,只有BaseName属性将被填充在ViewModel中.我将如何配置AutoMapper,以便它也可以映射子类中的属性?

However, what ends up happening is that only the BaseName property will be populated in the ViewModel. How would I configure AutoMapper so that it will map the properties in the subclasses as well?

推荐答案

AutoMapper中似乎存在一个错误或限制,您需要相应的TSource和TDestination层次结构.鉴于:

There appears to be a bug or limitation in AutoMapper that you need corresponding TSource and TDestination hierarchies. Given:

public class BaseClass {
    public string BaseName { get; set; }
}

public class Subclass1 : BaseClass {
    public string SubName1 { get; set; }
}

您需要以下视图模型:

public class ViewModel {
    public string BaseName { get; set; }
}
public class ViewModel1 : ViewModel {
    public string SubName1 { get; set; }
}

下面的代码将起作用:

 Mapper.CreateMap<BaseClass, ViewModel>()
       .Include<Subclass1, ViewModel1>();
 Mapper.CreateMap<Subclass1, ViewModel1>();

 var items = new List<BaseClass> {new Subclass1 {BaseName = "Base", SubName1 = "Sub1"}};
 var viewModels = Mapper.Map(items, new List<ViewModel>());

这篇关于如何使用AutoMapper将多个子类映射到一个类中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆