Automapper对具有不同类型隐藏属性的映射对象抛出异常



以下是我的分类:

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 ()

这解决了我的问题和所有其他问题,我一直有与自动映射器到目前为止。

最新更新