Trabajando me he encontrado con la necesidad de convertir varias listas de entidades en objetos DataTable.
Me ha llevado un rato construirla, pero así ha quedado.
Dejemos que el código hable.
/// <summary> /// Clase genérica para convertir una Lista Genérica de elementos en /// un objeto DataTable /// </summary> /// <typeparam name="T">Tipo de datos de los elementos de la Lista. /// Debe ser una clase con un constructor sin parámetros.</typeparam> public static class Converter<T> where T: new() { public static DataTable Convert(List<T> items) { // Instancia del objeto a devolver DataTable returnValue = new DataTable(); // Información del tipo de datos de los elementos del List Type itemsType = typeof(T); // Recorremos las propiedades para crear las columnas del datatable foreach (PropertyInfo prop in itemsType.GetProperties()) { // Crearmos y agregamos una columna por cada propiedad de la entidad DataColumn column = new DataColumn(prop.Name); column.DataType = prop.PropertyType; returnValue.Columns.Add(column); } int j; // ahora recorremos la colección para guardar los datos // en el DataTable foreach (T item in items) { j=0; object[] newRow = new object[returnValue.Columns.Count]; // Volvemos a recorrer las propiedades de cada item para // obtener su valor guardarlo en la fila de la tabla foreach (PropertyInfo prop in itemsType.GetProperties()) { newRow[j] = prop.GetValue(item, null); j++; } returnValue.Rows.Add(newRow); } // Devolver el objeto creado return returnValue; } }
Cómo usar esta clase?
Pues así:
static void Main(string[] args) { // Generar datos aleatorios List<Cliente> items = GenerateData(); // Realizar la conversión DataTable dt = Converter<Cliente>.Convert(items); Console.WriteLine(dt.Rows.Count); Console.Read(); }
Crossposted from crisfervil.com