以下是我的分类:
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);
我不知道我是否错过了一些简单的东西,或者是否有更好的方法来做到这一点或什么。
对于初学者来说,代码无法编译…
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>);
这两种方法都可以…这只是一个偏好:)
因此,经过深思熟虑和与AutoMapper的斗争,我发现了迄今为止我遇到的几乎所有问题的根源。
一旦你的对象开始变得复杂,在映射它们的时候,不要使用源和/或目标的接口就变得谨慎了。
在某些情况下(比如我的DTO),我仍然能够使用接口,但是对于业务逻辑对象,AutoMapper更倾向于使用具体类型。
实际上,当我创建映射时,我是在映射对象的接口:
Mapper.CreateMap
这解决了我的问题和所有其他问题,我一直有与自动映射器到目前为止。