miércoles, 4 de mayo de 2011

COCINANDO EXTENSIONES CON LINQ


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.



No hay comentarios:

Publicar un comentario