Automapper не может отобразить на IEnumerable - PullRequest
46 голосов
/ 15 апреля 2010

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

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 на него ...

Есть идеи, что происходит ??

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

Ответы [ 2 ]

109 голосов
/ 15 апреля 2010

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

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

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

11 голосов
/ 07 марта 2012

РЕДАКТИРОВАТЬ : я нашел простой способ использовать DynamicMap с коллекциями.

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

- Исходное сообщение -

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...