Extension Methods es una de las novedades que incorporan tanto la nueva versión del lenguaje C# (3.0) como el lenguaje VB.NET 2008 (o 9.0, que representan exactamente lo mismo, pero uno hace referencia a la versión del compilador y el otro es un nombre más comercial) ambos desplegados con la versión 3.5 del .NET Framework . Los Extension Methods (o métodos extensores) nos permiten añadir nuevos métodos a tipos ya existentes sin tener que crear un tipo derivado.

Un ejemplo clarificará el concepto:
Imaginemos que necesitamos añadir un nuevo método a la clase
String . Como sabemos, la clase String es un tipo interno del framework (built-in type), por lo que no podemos acceder a su código para modificarlo. La primera idea que nos vendría a la cabeza es hacer uso de una de las propiedades de la POO: la herencia. Efectivamente, podríamos crear una nueva clase que derivase de String y allí añadir el método que requerimos, pero gracias a los Extension methods esto no será necesario. Como hemos comentado, los extension methods nos permiten añadir métodos a tipos ya existentes. ¿Cómo? pues la sintaxis cambiará en función del lenguaje que se utilice, pero conceptualmente la idea es crear un método en el que, el primer parámetro será un objeto del tipo al que se desea añadir el método. El resto de parámetros serán del tipo que se requiera. A continuación se muestra la sintaxis tanto para VB.NET (9.0) como para C# (3.0):

C#:

public static tipo_retorno NombreDeLaFuncion (this tipo_al_que_añadir_metodo nombreDelParametro)

Ejemplo:
  

public static int ContarLetras (this string palabra)
{

           returnpalabra.Lenght;
}

Cabe remarcar el uso de la palabra reservada this delante del primer parámetro del nuevo método para indicar el tipo al que se desea añadir el mismo.

VB.NET:

 En VB.NET la sentencia cambia un poco, aunque conceptualmente se mantiene la misma idea: El primer parámetro indica el tipo al que se desea añadir el método. De forma genérica, un extension method se declara así en VB.NET:

<Extension( )>
Public [Sub|Function] NombreDelSubOFunction(Byval NombreDelParametro As tipo_al_que_añadir_el_método ) [AS tipo_retorno]

Ejemplo:

<Extension()>
Public Sub DimeElContenido (ByVal Nombre As String)

Console.WriteLine(Nombre)

End Sub

Ejemplo 2: lo mismo pero utilizando una función

<Extension()>
Public Function CuentaLetras ( ByVal Palabra As String) As Integer

return Palabra.Lenght

End Function

Nota: Para poder hacer referencia al atributo <Extension()> se deberá importar el espacio de nombres System.Runtime.CompilerServices.

Finalmente indicar que sólo pueden extenderse métodos, no se podrán extender propiedades (Properties), atributos (fields) o eventos (Events).

Finalmente, añado una captura de pantalla para que se vea como los extension methods funcionan y son reconocidos por el IntelliSense correctamente (aunque no hay nada como verlo en primera persona, ¿verdad?😉 )

 

Ejemplo de Extension Method (IntelliSense ya reconoce el método en el tipo especificado)

Figura 1: Ejemplo de Extension Method (IntelliSense ya reconoce el método en el tipo especificado)

 

 

Ejemplo con VB.NET.

Figura 2: Ejemplo con VB.NET.