2013-01-31 14 views
5

Ho il seguente frammento di codice.Automapper DynamicMap non riesce a mappare liste di tipi anonimi

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

testFile ha un valore mappato correttamente, ma filesDto è vuoto.

Sembra che dynamicMap funzioni su singoli elementi ma non elenchi?

files è un elenco di oggetti anonimi.

EDIT: Non funziona se utilizzo anche gli array. Posso farlo funzionare, ma ...

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

controllare Forse la seguente soluzione: http://stackoverflow.com/ a/5978050/1241400 –

+0

@plurby, che non si applica affatto, poiché quella domanda si riferisce a due tipi noti, ho una lista di un tipo anonimo, quindi ho bisogno di usare 'DynamicMap' invece di' Map' – CaffGeek

+0

Ho controllato e funziona quando usi query.Select (Mapper.DynamicMap ) .ToList(); sintassi. Puoi fornire il codice per la tua query e DTO in modo che possiamo aiutarti a risolvere il problema? –

risposta

7

Nella maggior parte degli scenari di mappatura, sappiamo il tipo stiamo mappando ad momento della compilazione. In alcuni casi, il tipo di origine non è noto fino al runtime , in particolare negli scenari in cui utilizzo i tipi dinamici o negli scenari di estensibilità .

La chiamata DynamicMap crea una configurazione per il tipo di oggetto origine passato al tipo di destinazione specificato. Se i due tipi sono già stati mappati, AutoMapper salta questo passaggio (come posso chiamare DynamicMap più volte per questo esempio).

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

Shorter versione: DynamicMap è lo stesso di chiamare CreateMap poi Mappa.

Alcuni manichino classe Person

Diciamo che avere una lista di persone.

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

Quindi si seleziona una persona aggiungendo una nuova proprietà.

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

Per ottenere mappati correttamente la prima persona

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

Per ottenere correttamente mappato tutte le persone si usa

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

Hai appena risposto con la soluzione che ho postato nel mio Edit. Il problema è che non dovrei aver bisogno di usare '.Seleziona' per mappare ogni oggetto singolarmente, dovrei essere in grado di mapparlo come una collezione con' Mapper.DynamicMap (file); 'I singoli oggetti funzionano, la lista no.Quindi conoscere la struttura della Dto non dovrebbe avere importanza, in quanto un singolo elemento mappa correttamente. – CaffGeek

+0

Lo so, ho appena fatto un test per vedere se funziona. Se trovi un problema pubblicalo o fai una richiesta di pull sulla pagina del progetto. Perché ti dà fastidio usare Select()? –

+1

Sembra hacker, e sono curioso di sapere perché non funziona come dovrebbe. – CaffGeek