Convertir Lista Genérica a DataTable
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();
}