Métodos extensores

26. January 2009 23:34 by Oscar.SS in Lenguajes  //  Tags:   //   Comments (2)

Los métodos extensores o métodos de extensión, son un tipo especial de métodos estáticos que se utilizan para añadir funcionalidad a otros tipos sin utilizar la herencia o el polimorfismo.

Aunque en principio los métodos extensores más comunes son los que se utilizan con los operadores de consulta estándar de LINQ, podemos también añandir funcionalidad a tipos sellados (sealed) o a tipos propios de .NET de los cuales no conocemos el código que los implementa.

Veamos cual es la sintaxis de los métodos de extensión:

 

   public static class NombreClaseContenedora
   {
      
public static ValorDevuelto NombreMetodoExtensor(this tipo argumento, parámetros)
      {
         
//Código del método extensor.
      
}
   }

Como podemos apreciar el método extensor es estático y está implementado en una clase también estática. Es importante mendionar que ambos, la clase y el método, deben tener el mismo modificador de accesibilidad, en este caso public. No tendría sentido poder acceder desde el código cliente a la clase y no poder hacerlo al método, por ejemplo.

Veamos un ejemplo práctico. Supongamos que tenemos que multiplicar una cantidad introducida por un usuario desde un TextBox y retornar el resultado a otro campo de texto. Es evidente que esto no tiene ninguna dificultad y que podríamos hacerlo con una función de las de siempre pero...veamos el ejemplo y luego entramos en los detalles.

 

   public static class ClaseExtensora
   {
      
public static string MultiplicarXDos(this string arg)
      {
         
int valor Convert.ToInt32(arg);
         
valor *2;
         return 
valor.ToString();
      
}
   }

El primer parámetro de MultiplicarXDos() especifica en qué tipo actúa el método y va precedido del modificador this. En este caso el método actua sobre los tipos System.String de .NET. Esto quiere decir que a partir de este momento, cualquier variable de tipo cadena que definamos en nuestro código tendrá añadido un método MultiplicarXDos().






A pesar de ser un método estático, la llamada al mismo se efectúa como si se tratase de un método de instancia en el tipo extendido. Para poder llamar al método, es necesario que el espacio de nombres en el que esta definida la clase contenedora del método extensor, esté explicitamente importada utilizando una directiva using. Es decir, que para utilizar este método extensor desde otro proyecto deberemos declarar un using EspacioDeNombres.

Como ya se ha comentado, el primer parámetro del método solo indica el tipo al que se le agrega el método. Si queremos podemos añadir tantos parámetros "normales" como queramos. A condición de que el primer parámetro siempre sea el que hace referencia al tipo extendido.

      public static string MultiplicarXDos(this string arg, int multiplicador)
      {
         
int valor Convert.ToInt32(arg);
         
valor *multiplicador;
         return 
valor.ToString();
      
}

A continuación os comento alguanas cosas que hay que tener en cuenta de los métodos de extensión:

  • Puede utilizar métodos de extensión para extender una clase, interfaz, enumerado, estructura, etc.
  • Los métodos de extensión no pueden tener acceso a las variables privadas del tipo que extienden.
  • En tiempo de compilación, los métodos de extensión siempre tienen menos prioridad que los métodos de instancia definidos en el propio tipo. Es decir, que nunca se llamará a un método de extensión que tenga el mismo nombre y firma que un método de la clase que extiende.
  • Y comentar una última cosa, la clase contenedora de los métodos extensores debe ser una clase de nivel superior. Es decir, no puede ser una clase anidada dentro de otra clase.

Comments (2) -

Juan
Juan
1/29/2009 10:19:29 PM #

Me ha parecido muy bueno el post. Hasta donde llegará este lenguaje.

Felicitaciones.

Oscar.SS
Oscar.SS
1/29/2009 11:15:37 PM #

Hola Juan:

No sé hasta donde llegará ni sé si yo podré seguirle la pista Smile

Un Saludo.

Recent Comments

Comment RSS

Month List