Orquestando proyectos

lunes 3 de noviembre de 2008

Métodos extensores en VB9

Una de las novedades que trae la nueva versión de VB9 son los métodos extensores.
Los métodos extensores son métodos que nos permiten extender la funcionalidad de cualquier clase, ya sea de nuestro proyecto, del mismo .net framework, o de terceros. Esto nos puede venir bien en ocasiones para aumentar la funcionalidad de clases cerradas sobre las que no tenemos control al código fuente.
Definir un método extensor es sencillo. Se definen a nivel de módulo, ya que no necesitan de una instancia en concreto (en C# se definen en clases státicas). Además del módulo, hay que incluir el atributo Extension() al método extensor. El atributo extensión, pertenece al namespace System.Runtime.CompilerServices. El primer parámetro de nuestro método, será la clase sobre la que estamos extendiendo su funcionalidad.
Vamos a ver esto con un sencillo ejemplo donde extendemos la clase String de .Net y le añadiremos un método ToTitle que formatea el string con la primera letra en mayúsculas y el resto en minúsculas (fácil, rápido y para toda la familia…)

''' Para indicar que es un metodo extensor, debe llevar el atributo Extension
_
Public Function ToTittle(ByVal str As String) As String
Try
' Saca la primera letra y la convierte a mays
Dim primeraLetra As Char
primeraLetra = str.Chars(0)
primeraLetra = Char.ToUpper(primeraLetra)

' Saca el resto de la frase y la pasa a mins
Dim restoFrase As String
restoFrase = str.Substring(1).ToLower

Return String.Format("{0}{1}", primeraLetra, restoFrase)

Catch ex As Exception
Throw ex
End Try
End Function

Una vez hecho esto, podemos utilizarlo desde:

Console.WriteLine(titulo.ToTittle())

En la siguiente imagen se puede ver como el Intelisense, detecta el método extensor y lo marca con un icono concreto:



Fijaros como incluso aparece la descripción del método que le di en la cabecera de la función:

''' Metodo Extensor de la clase string, que formatea una cadena
''' donde la primera letra la convierte a mays y el resto a mins

Invocar método sin extender

Si queremos invocar al método como un método “normal”, simplemente lo indicamos anteponiendo el nombre del módulo:

ExtensionesString.ToTittle(titulo)

Sobrecarga de métodos extensores

Sí, se puede!!, vamos a sobrecargar nuestro método extendido para que formatee el título como si fuera de un índice: “1.- Titulo de la sección”

_
Public Function ToTittle(ByVal str As String, ByVal orden As Integer, ByVal espacios As Integer) As String

Lo mismo para usarlo, pero pasando los parámetros requeridos para esa sobrecarga:

titulo.ToTittle(3, 5)

Pero, aquí quien manda???

Si tenemos un método extensor, que coincide con el mismo nombre y firma que un método interno, siempre se ejecutará el método interno a la clase.

Distribuyendo métodos extensores

Si distribuimos nuestro proyecto con método extensores, debemos tener en cuenta que en VB, cuando no se declara el alcance de un módulo, éste se asume como Friend, por lo que al distribuirlo y usarlo desde otro proyecto, no funcionará. Simplemente debemos definir nuestro módulo como Public para que pueda ser usado desde otros proyectos.

Si queréis saber más sobre el tema, os recomiendo:

Extension Methods: http://msdn.microsoft.com/en-us/magazine/cc163317.aspx
DotNetMania nº 50 (artículo de “El Guille”)

Os dejo el código fuente con el proyecto que he usado para el ar´ticulo y donde podéis ver todo esto funcionando: MetodosExtensores.zip

Nos vemos en la siguiente parada!!

Etiquetas: ,