2013-01-31 43 views
5

我有以下代碼片段。Automapper DynamicMap未能映射匿名類型列表

var files = query.ToList(); 
var testFile = Mapper.DynamicMap<EftFileDto>(files.First()); 
var filesDto = Mapper.DynamicMap<List<EftFileDto>>(files); 

testFile具有正確映射的值,但filesDto爲空。

它似乎dynamicMap適用於單個項目,但不是列表?

files是匿名對象列表。

編輯:如果我使用陣列,它也不起作用。我可以得到它的工作,但是...

 var filesDto = query.Select(Mapper.DynamicMap<EftFileDto>).ToList(); 
+0

或許檢查以下解決方案:http://stackoverflow.com/ a/5978050/1241400 –

+0

@plurby,根本不適用,因爲該問題涉及兩種已知類型,我有一個匿名類型的列表,所以我需要使用'DynamicMap'而不是'Map'。 – CaffGeek

+0

我檢查過它,當你使用query.Select(Mapper.DynamicMap ).ToList();句法。你能提供你的查詢和DTO代碼,以便我們可以幫助你解決問題嗎? –

回答

7

在大多數映射情況,我們知道我們在 編譯時映射到的類型。在某些情況下,直到運行時纔會知道源類型,特別是在我使用動態類型的情況下或在可擴展性方案中。

DynamicMap調用爲傳入指定的目標類型的源對象的類型創建配置。如果已經映射了兩種類型 ,則AutoMapper跳過此步驟(因爲本示例中可以多次調用 DynamicMap)。

來源:http://lostechies.com/jimmybogard/2009/04/15/automapper-feature-interfaces-and-dynamic-mapping/

較短的版本:DynamicMap是與調用CreateMap然後地圖

一些虛擬Person類

比方說你有人員名單。

var persons = new List<Person>(); 
for (int i = 0; i < 100; i++) 
{ 
     persons.Add(new Person { 
       Name = String.Format("John {0}", i), 
       Surname = String.Format("Smith {0}", i), 
       Age = i }); 
} 

然後您對添加新屬性的人進行選擇。

var anonymousTypes = persons.Select(p => new { 
      p.Name, 
      p.Surname, 
      FullName = String.Format("{0}, {1}", p.Surname,p.Name) }).ToList(); 

要獲得正確映射的第一人

var testFile = Mapper.DynamicMap<Person>(anonymousTypes.First()); 

要獲得正確映射所有的人,你會用

var testFiles = anonymousTypes.Select(Mapper.DynamicMap<Person>).ToList(); 
+1

您剛剛回答了我發佈在我的編輯中的解決方案。問題是我不應該使用'.Select'來單獨映射每個項目,我應該能夠使用'Mapper.DynamicMap (文件)將其映射爲集合;'單個項目工作,該列表沒有。因此,瞭解Dto的結構應該無關緊要,因爲單個項目可以正確映射。 – CaffGeek

+0

我知道,我剛剛提供了一個測試,看看它是否有效。如果您發現問題,請在項目頁面上發佈或發出拉取請求。爲什麼它打擾你使用Select()? –

+1

這看起來很詭異,我很好奇它爲什麼不按照它應該的工作。 – CaffGeek