web-dev-qa-db-fra.com

Automapper ne parvient pas à mapper sur IEnumerable

J'ai deux classes comme ça:

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; }
}

Et

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; }
}

Identique, comme vous pouvez le voir (ils implémentent tous les deux une interface pour garantir cela)

J'ai alors la cartographie suivante:

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

J'ai ensuite le test unitaire suivant:

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

Cela échoue - Le IEnumerable sentEmailAttachmentItems est vide. Il n'y a pas mappé la liste des attachements SentEmail ...

Une idée de ce qui se passe ??

Je le fais travailler sur des objets uniques (en mappant un de chacun à un de chacun) mais pas une collection ...

49
Alex

Vous n'avez pas besoin de mapper explicitement les types de collection, uniquement les types d'élément. Faites juste:

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

Cela fonctionnera très bien.

109
Jimmy Bogard

MODIFIER : J'ai trouvé un moyen simple d'utiliser DynamicMap avec des collections.

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

- Message original -

La façon dont Jimmy dit de l'utiliser fonctionne, mais j'essaie d'utiliser DynamicMap quand je peux pour éviter d'avoir à faire "CreateMap" pour chaque mappage dont j'ai besoin. Je ne pense pas que DynamicMap fonctionne très bien avec les collections, voire pas du tout. Il ne lève pas d'exception, mais le résultat est un ensemble vide.

D'après les tests des deux derniers jours, vous ne pouvez pas utiliser DynamicMap pour les collections pour le moment (à ma connaissance).

11
blockloop