Converti tipo anonimo in class

Ho ottenuto un tipo anonimo all’interno di un elenco anBook:

var anBook=new []{ new {Code=10, Book ="Harry Potter"}, new {Code=11, Book="James Bond"} }; 

È ansible convertirlo in una lista con la seguente definizione di clearBook:

 public class ClearBook { int Code; string Book; } 

utilizzando la conversione diretta, vale a dire, senza loop attraverso anBook?

Bene, puoi usare:

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

ma no, non esiste un supporto per la conversione diretta. Ovviamente dovrai aggiungere accessors, ecc. (Non rendere pubblici i campi) – immagino:

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

Ovviamente, l’altra opzione è iniziare con i dati come vuoi:

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

Ci sono anche cose che potresti fare per mappare i dati con la riflessione (magari usando Expression per compilare e memorizzare nella cache la strategia), ma probabilmente non ne vale la pena.

Come dice Marc, può essere fatto con gli alberi di riflessione e di espressione … e, per fortuna, c’è una class in MiscUtil che fa esattamente questo. Tuttavia, esaminando la tua domanda più da vicino sembra che tu voglia applicare questa conversione a una raccolta (array, elenco o qualsiasi altra cosa) senza fare il loop . Questo non può funzionare. Stai convertendo da un tipo a un altro – non è come se tu potessi usare un riferimento al tipo anonimo come se fosse un riferimento a ClearBook.

Per dare un esempio di come funziona la class PropertyCopy, hai solo bisogno di:

 var books = anBook.Select(book => PropertyCopy.CopyFrom(book)) .ToList(); 

Che mi dici di questa estensione? chiama semplicemente il .ToNonAnonymousList sul tuo tipo anonimo ..

 public static object ToNonAnonymousList(this List list, Type t) { //define system Type representing List of objects of T type: Type genericType = typeof (List<>).MakeGenericType(t); //create an object instance of defined type: object l = Activator.CreateInstance(genericType); //get method Add from from the list: MethodInfo addMethod = l.GetType().GetMethod("Add"); //loop through the calling list: foreach (T item in list) { //convert each object of the list into T object by calling extension ToType() //Add this object to newly created list: addMethod.Invoke(l, new[] {item.ToType(t)}); } //return List of T objects: return l; } public static object ToType(this object obj, T type) { //create instance of T type object: object tmp = Activator.CreateInstance(Type.GetType(type.ToString())); //loop through the properties of the object you want to covert: foreach (PropertyInfo pi in obj.GetType().GetProperties()) { try { //get the value of property and try to assign it to the property of T type object: tmp.GetType().GetProperty(pi.Name).SetValue(tmp, pi.GetValue(obj, null), null); } catch (Exception ex) { Logging.Log.Error(ex); } } //return the T type object: return tmp; }