2 de diciembre de 2009

Métodos Extensores

¿Que son los métodos extensores? ¿Como y donde usarlos? ¿Donde ver un ejemplo práctico? Si quieres aclarar estas preguntas, estas en el artículo indicado. Explicaremos mediante un ejemplo simples y práctico todo lo relacionado con los métodos extensores (Extension Methods).

Son varias las mejores que se incluyeron en C# 3.0, y seguramente la mayor es la inclusión de LINQ pero no vamos a hablar en este momento de LINQ, si no de los métodos extensores (Extension Methods).

¿Que son los Métodos Extensores?

Los métodos extensores, nos permiten “extender” o agregar funcionalidad a una clase ya existente sin necesidad de usar la herencia o polimorfismo.

Pero como de costumbre expliquémoslo mediante un ejemplo.

¿Ejemplo de Método Extensor?

En en ejemplo que explicaremos, “extenderemos” la clase string para implementarle un nuevo método extensor (ToInteger). Estoy seguro que en varias ocasiones has tenido que convertir un string en int, y para ello has hecho algo similar a lo siguiente:

    int numero = Convert.ToInt32(strEdad);

Pues con los métodos extensores podemos conseguir este mismo resultado pero de una forma más intuitiva, haciendo que parezca que el método extensor es propio de la misma clase. Para resolver el ejemplo planteado bastaría con agregar un método extensor a la clase string. Al hacerlo podríamos conseguir esto (ver imagen):

MetodosAnonimos

Pero veamos lo que tendríamos que hacer para conseguir el método extensor ToInteger().

Nota: Se puede ‘extender’ cualquier clase de cualquier tipo, ya sea de .NET o una clase definida por nosotros mismos o incluso un tercero.

Método Extensor C#

Para crear un método extensor en C# debemos usar la palabra reservada this como el primer parámetro del método.

Código C# de nuestro método extensor de ejemplo:

namespace dllComunes
{
  public static class Extensiones
  {  
    ///Metodo Extensor asociado a un string que devuelve un entero
    public static int ToInteger(this string cadena, int valorXDefecto)
    {
      int result = valorXDefecto;
 
      try
      {
        result = Convert.ToInt32(cadena);
      }
      catch {}
 
      return result;
    }
    ///Sobrecarga del Metodo Extensor. Si no pasamos el 2do parámetro, se asume 0
    public static int ToInteger(this string cadena)
    {
      return ToInteger(cadena, 0);
    }
  }  
}

En nuestro ejemplo extendimos la clase string, pero también podíamos haber extendido la clase object, y el mismo método extensor nos serviría en otras muchas situaciones prácticas, por ejemplo:

string strNumero = "03";
 
int numero1 = strNumero.ToInteger();
int numero2 = "05".ToInteger();
int numero3 = Request.QueryString["IdRegistro"].ToInteger();
int numero4 = Session["IdUsuario"].ToInteger();

Métodos Extensores, Requisitos

  1. Los métodos extensores además de ser estáticos (static), deben estar incluidos en clases estáticas.
  2. El primer parámetro del método será el tipo a extender y deberá estar precedido de la palabra reservada this.
  3. Es posible sobrecargar métodos existentes.
  4. Si definimos un método extensor coincidente con uno del tipo a extender, el nuestro será ignorado.
  5. Es posible extender clases, estructuras, interfaces y delegados.

Artículos Relacionados: