c# - qué - que es la inicializacion de objetos en c++
Convierta el tipo anónimo en clase (3)
¿Qué hay de estas extensiones? simple llame a .ToNonAnonymousList en su tipo anónimo ..
public static object ToNonAnonymousList<T>(this List<T> 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<T>()
//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<T>(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;
}
Tengo un tipo anónimo dentro de un List anBook:
var anBook=new []{
new {Code=10, Book ="Harry Potter"},
new {Code=11, Book="James Bond"}
};
Es posible convertirlo a una lista con la siguiente definición de clearBook:
public class ClearBook
{
int Code;
string Book;
}
mediante el uso de conversión directa, es decir, sin bucles a través de un libro?
Bueno, podrías usar:
var list = anBook.Select(x => new ClearBook {
Code = x.Code, Book = x.Book}).ToList();
pero no, no hay soporte de conversión directa. Obviamente, necesitará agregar accesadores, etc. (no haga públicos los campos) - Supongo que:
public int Code { get; set; }
public string Book { get; set; }
Por supuesto, la otra opción es comenzar con los datos como lo desee:
var list = new List<ClearBook> {
new ClearBook { Code=10, Book="Harry Potter" },
new ClearBook { Code=11, Book="James Bond" }
};
También hay cosas que podrías hacer para mapear los datos con la reflexión (quizás usando una Expression
para compilar y guardar en caché la estrategia), pero probablemente no valga la pena.
Como dice Marc, se puede hacer con árboles de reflexión y expresión ... y, por suerte, hay una clase en MiscUtil que hace exactamente eso. Sin embargo, si observa su pregunta más de cerca, parece que desea aplicar esta conversión a una colección (matriz, lista o lo que sea) sin bucles . Eso no puede funcionar. Está convirtiendo de un tipo a otro; no es como si pudiera usar una referencia al tipo anónimo como si fuera una referencia a ClearBook.
Para dar un ejemplo de cómo funciona la clase PropertyCopy, solo necesitarías:
var books = anBook.Select(book => PropertyCopy<ClearBook>.CopyFrom(book))
.ToList();