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...
Любая идея, что происходит?
У меня есть работа над отдельными объектами (сопоставление по одному по одному из них), но не с коллекцией...
Ответы
Ответ 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 для коллекций в это время (что я знаю).