2010-04-15 4 views
42

J'ai deux classes comme ceci:Automapper ne pas la carte sur 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; } 
} 

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

Identiques, comme vous pouvez le voir (ils mettre en œuvre l'interface pour en assurer)

J'ai alors le mappage suivant:

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

J'ai alors 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'a pas mappé la liste de SentEmailAttachments à lui ...

Une idée de ce qui se passe ??

Je l'ai travailler sur des objets simples (un mappage de chacun à l'un de chaque), mais pas une collection ...

Répondre

93

Vous n'avez pas besoin de mapper explicitement les types de collections, seuls les types d'éléments. Juste faire:

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

Cela fonctionnera très bien.

11

EDIT: J'ai trouvé un moyen facile 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 d'utiliser cela fonctionne, mais j'essaie d'utiliser DynamicMap quand je peux pour éviter d'avoir à faire « CreateMap » pour chaque mappage j'ai besoin. Je ne pense pas que DynamicMap fonctionne très bien avec les collections, voire pas du tout. Il ne lance pas d'exception, mais le résultat est un ensemble vide. Depuis les tests des deux derniers jours, vous ne pouvez pas utiliser DynamicMap pour les collections pour l'instant (à ma connaissance).

Questions connexes