miércoles, 20 de julio de 2011

Métodos extensores

En el post de clases y métodos parciales, dijimos que no podíamos combinar una clase parcial con una clase que esté en un ensamblado distinto. Siendo así, no es posible “ampliar la funcionalidad” de una clase con clases parciales en este escenario (lógicamente se puede heredar, implementar interfaces, pero aquí me estoy refiriendo al concepto de parecer una “garrapata” sobre una clase existente y que al final no notes la diferencia de quien era la clase original y la clase “acoplada”).

Para resolver esto, desde .NET Framework 3.5 tenemos disponibles los métodos extensores, que permiten ampliar la funcionalidad de una clase sin tener acceso a su código fuente (justamente, esto es lo que quería decir cuando hablaba de parecer una “garrapata”).

Un método extensor puede, bien agregar un nuevo método a la clase (Sub o Function), bien sobrecargar un método existente (fíjate que como su propio nombre indica, “métodos extensores” sólo permite extender métodos y no propiedades).

Un método extensor tiene que estar declarado en un módulo (lo siento, programo en VB.NET) y tiene que recibir como primer parámetro una variable del tipo que queremos extender. Además, el método extensor tiene que estar decorado con el atributo System.Runtime.CompilerServices.Extension (que está dentro del ensamblado System.Core)

Por ejemplo, podemos crear el siguiente código que:

  • Es un módulo.
  • Crea un método extensor.
    • Decorado con el atributo Extension.
    • Que recibe como primer parámetro una variable del tipo que extiende.

Module MisExtensiones

 

    ''' <summary>

    ''' Devuelve un valor que indica si el número es mayor que 5.

    ''' </summary>

    ''' <param name="value">Del tipo Integer,</param>

    ''' <returns></returns>

    ''' <remarks>Método de extensión.</remarks>

    <System.Runtime.CompilerServices.Extension()> _

    Public Function EsMayorQue5(ByVal value As Integer) As Boolean

        Return If(value > 5, True, False)

    End Function

 

End Module

Ahora, podemos utilizar normalmente variables del tipo Integer y aparecerá mágicamente nuestro nuevo método:

clip_image002[4]

Si os fijáis, el icono de un método extensor es clip_image003[4], y además en el tooltip aparece <Extension> delante de la firma del método.

Además también puede utilizar el método extensor como si fuera simplemente un método declarado en un módulo (que realmente es lo que es).

clip_image005[4]

Por otro lado, también podemos agregar métodos extensores que sobrecargan métodos existentes (siempre de instancia, no se puede sobrecargar métodos compartidos a través de métodos extensores).

Module MisExtensiones

 

    ' Ejemplo de sobrecarga con un método de extensión

    <System.Runtime.CompilerServices.Extension()> _

    Public Function Trim(ByVal value As String, ByVal toUpper As Boolean) As String

        ' Aquí se está llamando al método Trim nativo

        value = value.Trim

        If toUpper Then

            value = value.ToUpper

        End If

        Return value

    End Function

 

End Module

 

clip_image006[4]

Como colofón al artículo, mi recomendación es NO abusar de los métodos extensores, es decir, a no ser que estemos entre la espada y la pared, yo personalmente no voy a utilizarlos, pero como ASP.NET MVC los utiliza para definir Helpers personalizados (y ahora mismo me encuentro estudiando MVC) quería dejar escrito aquí como se trabaja con ellos.

Un saludo!

No hay comentarios:

Publicar un comentario