2009-01-15 17 views
21

erhielt ich einen anonymen Typ in einer Liste anBook:Konvertieren Anonym Typ der Klasse

var anBook=new []{ 

new {Code=10, Book ="Harry Potter"}, 
new {Code=11, Book="James Bond"} 
}; 

Ist zu möglich, es mit der folgenden Definition von clearBook auf eine Liste zu konvertieren:

public class ClearBook 
{ 
    int Code; 
    string Book; 
} 

unter Verwendung Direktkonvertierung, dh ohne Durchblättern eines Buches?

Antwort

37

Nun, könnten Sie verwenden:

var list = anBook.Select(x => new ClearBook { 
       Code = x.Code, Book = x.Book}).ToList(); 

aber nein, gibt es keine direkte Konvertierung unterstützen. Natürlich müssen Sie Accessoren hinzufügen usw. (nicht über die Felder öffentlich machen) - Ich würde raten:

public int Code { get; set; } 
public string Book { get; set; } 

Natürlich ist die andere Option ist, mit den Daten zu beginnen, wie Sie es wollen:

var list = new List<ClearBook> { 
    new ClearBook { Code=10, Book="Harry Potter" }, 
    new ClearBook { Code=11, Book="James Bond" } 
}; 

es gibt auch Dinge, die Sie tun können, die Daten mit Reflexion zur Karte (vielleicht eine Expression mit der Strategie zu erstellen und Cache), aber es ist wahrscheinlich nicht wert.

11

Wie Marc sagt, kann es mit Reflexion und Ausdruck Bäumen getan werden ... und wie es der Zufall wollte, gibt es eine Klasse in MiscUtil, die genau das tut. Wenn Sie jedoch Ihre Frage näher betrachten, klingt es so, als ob Sie diese Konvertierung auf eine Sammlung (Array, Liste oder was auch immer) anwenden möchten. ohne Schleife. Das kann unmöglich funktionieren. Sie konvertieren von einem Typ in einen anderen - es ist nicht so, dass Sie einen Verweis auf den anonymen Typ verwenden können, als ob es sich um einen Verweis auf ClearBook handelt.

Um ein Beispiel zu geben, wie die PropertyCopy Klasse funktioniert allerdings würde, die Sie gerade brauchen:

var books = anBook.Select(book => PropertyCopy<ClearBook>.CopyFrom(book)) 
           .ToList(); 
+0

Kann die CLR den Typ und den Namen der Eigenschaft nicht ableiten und die automatische Konvertierung durchführen? .Net 4.0 sollte auf diese – Graviton

+0

verbessern, so dass ich den Typ nicht selbst erklären muss. – Graviton

+0

Ich kann nicht sagen, dass ich viel Nachfrage nach diesem gesehen habe, und wenn sich im Allgemeinen eine schlechte Idee fühlt. –

4

Was über diese Erweiterung? Rufen Sie einfach die .ToNonAnonymousList auf Ihrem anonymen Typ.