Crear una colección de elementos personalizada con C#

Es habitual al desarrollar una aplicación necesitar agrupar elementos en forma de colecciones. Para ello .NET Framework dispone de una clase abstracta llamada CollectionBase que debe usarse como base para la creación de colecciones de elementos.

Esta clase dispone de un ArrayList interno accesible mediante InnerList que es el que se utiliza para almacenar la información, aunque podemos utilizar otro tipo de datos si lo necesitamos. Dispone también de una forma de acceder a la lista de elementos mediante otra propiedad de nombre List. Si utilizamos esta forma de acceso al ArrayList interno dispondremos de la ventaja de que List genera eventos cuando se añaden o eliminan datos y podremos crear métodos que realicen comprobaciones sobre estos datos.

A continuación se muestra un ejemplo de colección personalizada para almacenar un tipo externo de nombre FacturaLinea, perteneciente al namespace Eslomas.Ejemplos.

 
using Eslomas.Ejemplos;
public class FacturaLineaCollection : CollectionBase  {
 
   // Para acceder a los elementos mediante []
   public FacturaLinea this[int index]{get{return((FacturaLinea)List[index]);}set{List[index]=value;}}
 
   public int Add(FacturaLinea value){
      return( List.Add( value ) );
   }
 
   public int IndexOf(FacturaLinea value){
      return( List.IndexOf( value ) );
   }
 
   public void Insert(int index, FacturaLinea value){
      List.Insert( index, value );
   }
 
   public void Remove(FacturaLinea value){
      List.Remove( value );
   }
 
   public bool Contains(FacturaLinea value){
      return( List.Contains( value ) );
   }
 
   //
   // Utilizamos List para acceder a la colección interna, por lo que es necesario
   // que sobrecarguemos los siguientes métodos que se encargan de comprobar
   // los datos que llegan
   //
 
   protected override void OnInsert(int index, Object value){
      if (value.GetType() != Type.GetType("Eslomas.Ejemplos.FacturaLinea"))
         throw new ArgumentException("value must be of type FacturaLinea.", "value");
   }
 
   protected override void OnRemove( int index, Object value )  {
      if ( value.GetType() != Type.GetType("Eslomas.Ejemplos.FacturaLinea") )
         throw new ArgumentException( "value must be of type FacturaLinea.", "value" );
   }
 
   protected override void OnSet( int index, Object oldValue, Object newValue )  {
      if ( newValue.GetType() != Type.GetType("EsLoMas.Ejemplos.FacturaLinea") )
         throw new ArgumentException( "newValue must be of type FacturaLinea.", "newValue" );
   }
 
   protected override void OnValidate( Object value )  {
      if ( value.GetType() != Type.GetType("Eslomas.Ejemplos.FacturaLinea") )
         throw new ArgumentException( "value must be of type FacturaLinea." );
   }
}
Twitter Digg Delicious Stumbleupon Technorati Facebook Email

3 Respuestas para “Crear una colección de elementos personalizada con C#”

  1. women_programer 13. Dic, 2005 en 2:09 pm

    como podria encontrar el namespace Eslomas.Ejemplos.
    esque no se de dnde sale lo de lista…….. asias espero me hexeis na mano!

  2. women, el namespace es el que ha puesto él como ejemplo, yo he usado esta ayuda y he cambiado el namespace por el nombre que usa mi aplicación (de hecho no lo he añadido como cláusula using)

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections; — posiblemente tengas q poner este namespace para que te pille el coleectionbase

    namespace MensajesBD
    {
    class Grupo : CollectionBase
    {
    //espacio para métodos
    }
    }

  3. Exelente ejemplo, muy bueno, de mucha ayuda y bastante intuitivo. No le quedaria mal poner un par de lineas de comentarios más, no falta el personaje que no tiene ni idea de lo que se hace cuando se define una función con override por ejemplo.