【发布时间】:2017-07-10 08:25:01
【问题描述】:
我需要实现一个可插入系统,其中 Automapper 配置文件可以由许多 DLL 提供。
要映射的对象有一个人员列表:
public class CompanySrc
{
public List<PersonSrc> Persons {get;set;}
}
public class CompanyDest
{
public List<PersonDest> Persons {get;set;}
}
PersonSrc 和 PersonDest 是可以在每个 DLL 中扩展的抽象类:
DLL1:
public class EmployeeSrc : PersonSrc
{
...
}
public class EmployeeDest : PersonDest
{
...
}
DLL2:
public class ManagerSrc : PersonSrc
{
...
}
public class ManagerDest : PersonDest
{
...
}
这个想法是实现类似的东西:
public class DLL1Profile : Profile
{
public DLL1Profile()
{
CreateMap<PersonSrc, PersonDest>()
.Include<EmployeeSrc, EmployeeDest>();
CreateMap<EmployeeSrc, EmployeeDest>();
}
}
public class DLL2Profile : Profile
{
public DLL2Profile()
{
CreateMap<PersonSrc, PersonDest>()
.Include<ManagerSrc, ManagerDest>();
CreateMap<ManagerSrc, ManagerDest>();
}
}
映射是通过以下方式完成的
var mc = new MapperConfiguration(cfg =>
{
cfg.CreateMap<CompanySrc, CompanyDest>()
cfg.AddProfile(new DLL1Profile());
cfg.AddProfile(new DLL2Profile ());
});
IMapper sut = mc.CreateMapper();
var result = sut.Map<CompanyDest>(companySrc);
但这种方法不起作用。当“人员”列表包含员工和经理时,我尝试映射整个列表时出现异常。 有什么建议吗?
【问题讨论】:
-
你的意思是因为多态性?所以你有一个包含
People的列表,其中一些列表可能是Manager,一些可能是Employee?如果是这种情况,那么应用您的Profile之一会导致异常是有道理的,因为当列表包含两种类型时,它将尝试映射到Manager或Employee...话虽如此,我认为 Automapper 不会映射 Dest 上不存在的道具,而不是抛出异常。也许问题缺少一些信息(即异常消息是什么?) -
我用更多信息编辑了这个问题。抛出的异常具有误导性,因为映射器似乎无法映射字段,但内部存在未设置的对象引用,因为自动映射器可能会尝试创建“Person”的实例,但由于它是抽象的,所以它不能。
标签: c# .net automapper automapper-5