Automapper无法映射IEnumerable。

58

我有两个类,如下所示:

public class SentEmailAttachment : ISentEmailAttachment
{
    public SentEmailAttachment();

    public string FileName { get; set; }
    public string ID { get; set; }
    public string SentEmailID { get; set; }
    public string StorageService { get; set; }
    public string StorageServiceFileID { get; set; }
}

并且

public class SentEmailAttachmentItem : ISentEmailAttachment
{
    [ItemName]
    public string ID { get; set; }
    public string SentEmailID { get; set; }
    public string FileName { get; set; }
    public string StorageService { get; set; }
    public string StorageServiceFileID { get; set; }
}

正如您所看到的,它们是相同的(它们都实现了接口来确保这一点)。

接下来,我有以下映射:

Mapper.CreateMap<IEnumerable<SentEmailAttachmentItem>, IEnumerable<SentEmailAttachment>>();
Mapper.CreateMap<IEnumerable<SentEmailAttachment>, IEnumerable<SentEmailAttachmentItem>>();

然后我有以下单元测试:

//create a load of sent email attachments
var listOfSentEmailAttachments = new List<SentEmailAttachment>();

for (int i = 0; i < 10; i++)
    listOfSentEmailAttachments.Add(new SentEmailAttachment { FileName = "testFileName", ID = Guid.NewGuid().ToString(), SentEmailID = Guid.NewGuid().ToString(), StorageService = "S3", StorageServiceFileID = "SomeFileID" });

var sentEmailAttachmentItems = Mapper.DynamicMap<IEnumerable<SentEmailAttachment>, IEnumerable<SentEmailAttachmentItem>>(listOfSentEmailAttachments);

var itemToTest = sentEmailAttachmentItems.First();

Assert.IsInstanceOfType(itemToTest, typeof(SentEmailAttachmentItem));

这个失败了 - IEnumerable sentEmailAttachmentItems 是空的。 它没有将 SentEmailAttachments 的列表映射到它上面...

有任何想法是怎么回事吗?

我已经在单个对象上工作过(将每个对象映射到每个对象),但不能处理集合...

3个回答

130

您无需显式映射集合类型,只需要映射其元素类型即可。只需执行以下操作:

Mapper.CreateMap<SentEmailAttachment, SentEmailAttachmentItem>();
var attachments = Mapper.Map<IEnumerable<SentEmailAttachment>, List<SentEmailAttachmentItem>>(someList);

那样做完全没有问题。


3
我有完全相同的情况,但不知何故,在映射后我的列表返回为空。我正在从IEnumerable列表进行映射,该列表中肯定有项目,但在映射后目标列表为空。 - Jacques

13

编辑:我找到了一种使用DynamicMap和collections的简单方法。

IEnumerable<FakeItem> unmappedItems = Repository.GetItems();
IEnumerable<MappedItem> mappedItems = unmappedItems.Select(Mapper.DynamicMap<MappedItem>);

— 原始消息 —

Jimmy的使用方式是可行的,但我尽可能使用DynamicMap来避免需要为每个映射都执行“CreateMap”。 我认为DynamicMap不能很好地处理集合,如果可以的话。 它不会抛出异常,但结果是一个空集。

从最近几天的测试中,您目前无法对集合使用DynamicMap(据我所知)。


-1

这让我在单元测试中感到非常疯狂,请注意使用It.Is而不是It.IsAny

_mapper.Setup(m => m.Map<IEnumerable<SentEmailAttachment>, IEnumerable<SentEmailAttachmentItem>>(It.Is<IEnumerable<SentEmailAttachment>>(x => x.Count() == 20))).Returns(sentEmailAttachmentDtoRes);

顺便说一句,我使用GenFu来生成预期的返回结果:

var sentEmailAttachmentDtoRes = GenFu.ListOf<SentEmailAttachmentItem>(20);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接