以下是我的课程:
public class A
{
public int archive {get; set;}
}
public class B : A
{
public new bool archive {get; set;}
}
public class aDTO
{
public int archive {get; set;}
}
public class bDTO : aDTO
{
public new bool archive {get; set;}
}
现在,当我尝试使用AutoMapper将类bDTO映射到B类时,它会抛出异常。这是我正在使用的映射器代码。
IEnumerable<bDTO> myBDTOCollection = getCollection;
Mapper.CreateMap<bDTO, B>();
IEnumerable<B> BList = Mapper.Map<IEnumerable<bDTO>, IEnumerable<B>>(myBDTOCollection);
我不知道我是否遗漏了一些简单的东西,或者是否有更好的方法来做这个或什么。任何意见都将不胜感激。
答案 0 :(得分:0)
对于代码不会编译的初学者......
public new archive bool {get; set;}
应该是......
public new bool archive {get; set;}
你的问题是你有错误的方式为CreateMap的类型参数...顺序是
Mapper.CreateMap<SourceType, DestinationType>()
这应该有用......
Mapper.CreateMap<bDTO, B>();
IEnumerable<B> BList = Mapper.Map<IEnumerable<bDTO>, IEnumerable<B>>(myBDTOCollection);
作为一个建议我认为整个集合的语法映射是凌乱的......我更喜欢这个......
IEnumerable<B> BList = myBDTOCollection.ToList().ConvertAll(Mapper.Map<bDTO, B>);
无论哪种方式都可以做到这一点......只是偏好:)
答案 1 :(得分:0)
因此经过深思熟虑并与AutoMapper作战后,我发现了迄今为止遇到的几乎所有问题的根源。
一旦你的对象开始变得复杂,那么在映射它们时你就不要使用接口作为源和/或目的地了。
在某些情况下(比如我的DTO),我仍然能够使用界面,但对于业务逻辑对象,AutoMapper更喜欢使用的具体类型。
实际上,当我创建地图时,我正在为我的对象映射接口:
Mapper.CreateMap&lt; IbDTO,IB&gt;()
当我映射业务对象的具体类型时,解决了我的问题:
Mapper.CreateMap&lt; IbDTO,B&gt;()
这解决了我的问题以及到目前为止我使用Auto Mapper遇到的所有其他问题。