Подтвердить что ты не робот

Automapper не удается сопоставить IEnumerable

У меня есть два класса:

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

Затем у меня есть следующий Unit test:

//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...

Любая идея, что происходит?

У меня есть работа над отдельными объектами (сопоставление по одному по одному из них), но не с коллекцией...

4b9b3361

Ответ 1

Вам не нужно явно отображать типы коллекций, только типы элементов. Просто выполните:

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

Это будет прекрасно работать.

Ответ 2

EDIT. Я нашел простой способ использовать DynamicMap с коллекциями.

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

- Оригинальное сообщение -

Как говорит Джимми, чтобы использовать его, но я стараюсь использовать DynamicMap, когда могу, чтобы избежать необходимости делать "CreateMap" для каждого сопоставления, в котором я нуждаюсь. Я не думаю, что DynamicMap работает с коллекциями очень хорошо, если вообще. Он не генерирует исключение, но результатом является пустой набор.

Из тестирования за последние пару дней вы не можете использовать DynamicMap для коллекций в это время (что я знаю).