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

时间:2011-10-20 22:11:03

标签: c# c#-4.0 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);

我不知道我是否遗漏了一些简单的东西,或者是否有更好的方法来做这个或什么。任何意见都将不胜感激。

2 个答案:

答案 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遇到的所有其他问题。