自动映射器无法映射IEnumerable

Ale*_*lex 48 c# automapper

我有两个类,所以:

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; }
}
Run Code Online (Sandbox Code Playgroud)

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; }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样相同(它们都实现接口以确保这一点)

然后我有以下映射:

Mapper.CreateMap<IEnumerable<SentEmailAttachmentItem>, IEnumerable<SentEmailAttachment>>();
Mapper.CreateMap<IEnumerable<SentEmailAttachment>, IEnumerable<SentEmailAttachmentItem>>();
Run Code Online (Sandbox Code Playgroud)

然后我进行了以下单元测试:

//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));
Run Code Online (Sandbox Code Playgroud)

这失败 - IEnumerable sentEmailAttachmentItems为空.它没有将SentEmailAttachments列表映射到它......

知道发生了什么事吗?

我让它处理单个对象(将每个对象映射到每个对象之一)但不是集合...

Jim*_*ard 110

您不需要显式映射集合类型,只需要映射项类型.做就是了:

Mapper.CreateMap<SentEmailAttachment, SentEmailAttachmentItem>();
var attachments = Mapper.Map<IEnumerable<SentEmailAttachment>, List<SentEmailAttachmentItem>>(someList);
Run Code Online (Sandbox Code Playgroud)

这将工作得很好.

  • 我有同样的情况,由于某种原因,我的列表在映射后返回为空。我映射的 IEnumerable 列表中肯定有项目,但映射后目标列表为空。 (4认同)

blo*_*oop 11

编辑:我找到了一个简单的方法来使用DynamicMap与集合.

IEnumerable<FakeItem> unmappedItems = Repository.GetItems();
IEnumerable<MappedItem> mappedItems = unmappedItems.Select(Mapper.DynamicMap<MappedItem>);
Run Code Online (Sandbox Code Playgroud)

- 原始信息 -

Jimmy说使用它的方式很有效,但我尽量避免使用DynamicMap来避免为我需要的每个映射做"CreateMap".我不认为DynamicMap可以很好地处理集合,如果有的话.它不会抛出异常,但结果是空集.

通过过去几天的测试,您不能在此时使用DynamicMap进行收藏(我知道).