En esta seccion veremos como extender nuestras clases, inicialmente veamos una breve definición de que es una extensión:
“Metodo de extension: es un metodo estatico de una clase estatica, que usted puede llamar como si fuese un metodo de instancia de una clase diferente a donde se definió” (defunción ubicada en http://riegalabola.blogspot.com/ blog recomendable para saber que es una extensión)
Pues bueno ahora extenderemos una clase genérica (o de templeta llamada asi en el buen C); comencemos:
Nuestro objetivo es convertir una lista List en un datatable:
Bien el código para el mismo es:
using System;
using System.Reflection;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Text;
namespace MisExtensiones
{
public static class Extensiones
{
public static DataTable toDataTable(this IEnumerable source)
{
//instanciamos el objeto a devolver
DataTable dt = new DataTable();
//extraemos el TIPO DE LA TEMPLATE PARA RESCATAR SUS PROPIEDADES
Type tipo = typeof(T);
// instanciamos las columnas aplicando algo de Reflection, una columna por cada propiedad del objeto
foreach (PropertyInfo a in tipo.GetProperties())
{
DataColumn dc = new DataColumn(a.Name);
dt.Columns.Add(dc);
}
//llenamos los datos por cada elemento
foreach (var item in source)
{
DataRow dr = dt.NewRow();
for (int i = 0; i < dt.Columns.Count; i++)
{
dr[dt.Columns[i].ColumnName] = item.GetType().GetProperty(dt.Columns[i].ColumnName).GetValue(item, null);
}
dt.Rows.Add(dr);
}
return dt;
}
}
}
Bueno para aclarar que es reflection es necesario leer: http://msdn.microsoft.com/en-us/library/ms173183(v=vs.80).aspx
Ahora pongamos en acción nuestras líneas de código:
Inicialmente construiremos una clase modelo persona:
public class Persona
{
public string nombre { get; set; }
public string apellidos { get; set; }
}
Seguidamente instanciamos una lista de la misma recuerden agregar las extensiones (no olviden agrear la linea using MisExtensiones en su codigo para poder usar la extension):
static void Main(string[] args)
{
List<Persona> l = new List<Persona>();
Persona a = new Persona { nombre = "Ruben", apellidos = "Chalco"};
l.Add(a);
a = new Persona { nombre = "Ronald", apellidos = "Bedregal" };
l.Add(a);
a = new Persona { nombre = "Ramon", apellidos = "Caceres" };
l.Add(a);
//eh aqui nuestra extension :D
DataTable dt = l.toDataTable<Persona>();
}
Fijase en el intellisense como se visualiza el datatable:
Y listo sírvase este delicioso aplicativo de Test de nuestra extensión.