2010-04-15 19 views
42

我有這樣兩類這樣: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>>(); 

我那麼有以下單元測試:

//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的列表映射到它...

任何想法發生了什麼?

我有工作在單個對象(每個映射到每個之一的一個),但不是一個集合......

回答

93

你並不需要顯式地映射集合類型,只有項目類型。只要這樣做:

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

這將工作得很好。

11

編輯:我發現了一個簡單的方法來使用DynamicMap的集合。

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

- 原始郵件 -

的方式吉米說,使用它的工作原理,但我嘗試時,我可以用DynamicMap,以避免做「CreateMap」爲每一個映射,我需要。如果有的話,我認爲DynamicMap不能很好地處理集合。它不會拋出異常,但結果是空集。

從過去幾天的測試,你不能在這個時候使用DynamicMap(我知道)。