2010-04-15 13 views
42

Mam dwie klasy tak:Automapper braku mapować na 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; } 
} 

I

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

identyczne, jak widać (obaj zaimplementować interfejs w celu zapewnienia tego)

Następnie mam następujące mapowanie:

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

Potem mają następujące testy jednostkowe:

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

zawiedzie ta - IEnumerable sentEmailAttachmentItems jest pusty. Nie zamapowano listy SentEmailAttachments na to ...

Każdy pomysł, co się dzieje?

mam to działa na pojedynczych obiektów (mapowanie jeden do jednego z każdego), ale nie każdy zbiór ...

Odpowiedz

93

Nie trzeba jawnie map rodzaje zbiórki przyjmuje się tylko te typy elementów. Po prostu wykonaj:

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

To zadziała dobrze.

11

EDYCJA: Znalazłem łatwy sposób na użycie DynamicMap z kolekcjami.

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

- Oryginalna wiadomość -

Sposób Jimmy mówi używać to działa, ale próbuję użyć DynamicMap kiedy tylko mogę, aby uniknąć konieczności zrobić „CreateMap” dla każdego odwzorowania muszę. Nie sądzę, że DynamicMap bardzo dobrze współpracuje z kolekcjami, jeśli w ogóle. Nie rzuca wyjątku, ale wynikiem jest pusty zbiór.

Z testów przeprowadzonych w ciągu ostatnich kilku dni nie można obecnie korzystać z DynamicMap do kolekcji (o której mi wiadomo).

Powiązane problemy