Ago 21 2008
Métodos de extensión en VB.NET (Extension Methods) {
Los métodos de extensión, extension methods en inglés, son una de las novedades de la última versión de .Net Framework. Como su nombre lo indica, estos métodos permiten extender la funcionalidad de una clase sin la necesidad de tener el código fuente de la misma.
En VB.NET se utiliza un módulo para escribir los métodos de extensión, y justamente esa es la causa de muchas críticas negativas respecto a la utilización de éstos métodos.
Dentro del módulo necesitaremos definir los métodos y en su firma incluir el atributo que es el que definirá a nuestro método como método de extensión.
Luego hay que tener al menos un parámetro en la firma, que es el que indicará la clase que este método va a extender, por ejemplo hagamos un método para extender la clase String:
<Extension()> _ Public Function ReemplazoArroba(ByVal Cadena As String) As String Return Cadena.Replace("@", "(a)") End Function
Entonces podremos llamar a nuestro método como un método de instancia:
Me.TextBox1.Text = Me.TextBox2.Text.ReemplazoArroba()
En la firma del método está el parámetro que define la clase que se extiende, pero a la hora de llamarlo, ese parámetro no se utiliza, ahora hagamos que nuestro método de extensión acepte en un parámetro el reemplazo que utilizará para el caracter @.
<Extension()> _ Public Function ReemplazoArroba(ByVal Cadena As String, Reemplazo as String) As String Return Cadena.Replace("@", Reemplazo) End Function
Ahora si, a la hora de llamarlo tendremos que pasar el parámetro Reemplazo:
Me.TextBox1.Text = Me.TextBox2.Text.ReemplazoArroba("[arroba]")
De la misma manera y en el mismo módulo podremos implementar métodos de extensión para varias clases, también se podrían implementar en un módulo ya existente de nuestro proyecto, pero por prolijidad yo prefiero hacerlo en uno aparte.
El siguiente método extiende la clase System.Windows.Forms.Control.ControlCollection y le agrega un método que puede resultar realmente útil, es un método que busca recursivamente todos los controles de tipo TextBox y borra su contenido.
<Extension()> _ Public Sub EmptyAllTextBoxes(ByVal Controls As Windows.Forms.Control.ControlCollection) For Each c As Control In Controls If c.Controls IsNot Nothing AndAlso c.Controls.Count > 0 Then EmptyAllTextBoxes(c.Controls) ' Llamado recursivo ElseIf c.GetType().Equals(GetType(TextBox)) Then CType(c, TextBox).Text = String.Empty End If Next End Sub
Pueden descargar una solución de VS2008 con ejemplos de métodos de extensión (55.25 KB) para probar y modificar el código.
}