Archivo por meses: septiembre 2019

Métodos de Extensión (Extesion Methods) en VB y C#

Pues eso… te voy a mostrar algunos ejemplos de los métodos de extensión (Extension Methods) que no es ni más ni menos que una forma de extender el funcionamiento de tipos ya existentes. Como de costumbre, el código de ejemplo estará tanto para Visual Basic .NET como para C#.

Por ejemplo, que es lo que mostraré en este «post», tenemos las cajas de texto (TextBox) a los que le daremos propiedades para convertir el contenido de la propiedad Text en valores de tipo fecha (Date), hora (TimeSpan), enteros (Integer), decimales (Decimal) o Boolean.

Para hacer esto solo tenemos que tener una importación al espacio de nombres System.Runtime.CompilerServices y aplicar al método de extensión el atributo Extension y definir el método con lo que queramos que amplíe al tipo en cuestión. Y lo importante de ese método es que: el tipo a ampliar será el primer argumento del método.

Definir los métodos de extensión

Lo primero que hay que hacer es definir los métodos de extensión.

Esa definición la haremos en clases estáticas que en el caso de Visual Basic nos servirán los módulos (Module) mientras que en C# tendrán que ser métodos compartidos (static) definidos en una clase también compartida o estática (static).

Veamos el código de una clase simple que añadirá el método AsDate y AsInteger a un TextBox. De forma que si quieres convertir el contenido de la propiedad Text de la caja de texto TextBox1 en una fecha solo tengas que hacer algo como esto: fecha = TextBox1.AsDate.

Ejemplo de métodos de extensión para Visual Basic .NET

Imports System.Windows.Forms
Imports System.Runtime.CompilerServices

Module ExtensionTextBox

    ''' <summary>
    ''' Devuelve un valor Date de la propiedad Text del TextBox indicado.
    ''' Si la fecha no es válida devuelve el 1 de enero de 1900.
    ''' </summary>
    ''' <param name="txt">El TextBox a extender</param>
    <Extension>
    Public Function AsDate(txt As TextBox) As Date
        Dim f = New Date(1900, 1, 1)

        Date.TryParse(txt.Text, f)

        Return f
    End Function

    ''' <summary>
    ''' Devuelve un valor Integer de la propiedad Text del TextBox indicado.
    ''' </summary>
    ''' <param name="txt">El TextBox a extender</param>
    <Extension>
    Public Function AsInteger(txt As TextBox) As Integer
        Dim i As Integer = 0

        Integer.TryParse(txt.Text, i)

        Return i
    End Function

End Module

Ejemplo de métodos de extensión para C#

using System.Runtime.CompilerServices;
using System.Windows.Forms;

public static class ExtensionTextBox
{
    /// <summary>
    /// Devuelve un valor Date de la propiedad Text del TextBox indicado.
    /// Si la fecha no es válida devuelve el 1 de enero de 1900.
    /// </summary>
    /// <param name="txt">El TextBox a extender</param>
    public static DateTime AsDate(this TextBox txt)
    {
        var f = new DateTime(1900, 1, 1);

        DateTime.TryParse(txt.Text, out f);

        return f;
    }

    /// <summary>
    /// Devuelve un valor Integer de la propiedad Text del TextBox indicado.
    /// </summary>
    /// <param name="txt">El TextBox a extender</param>
    public static int AsInteger(this TextBox txt)
    {
        int i = 0;

        int.TryParse(txt.Text, out i);

        return i;
    }
}

Ejemplo de uso de los métodos de extensión

En este ejemplo tendremos un formulario con un par de cajas de texto y unas etiquetas, además de un botón que hará ciertos cálculos con los datos de las cajas de textos y mostrará el resultado en las etiquetas.

En la siguiente captura tienes el aspecto del formulario de ejemplo y a continuación verás el código para usar esos métodos de extensión.

Figura 1. El formulario en modo diseño
Figura 1. El formulario en modo diseño

El código del botón «Convertir» en Visual Basic y C#

Private Sub btnConvertir_Click(sender As Object,
                               e As EventArgs) Handles btnConvertir.Click
    Dim fecha = txtFecha.AsDate
    LabelFecha.Text = "La fecha + 1 día = " & fecha.AddDays(1).ToString("dddd, dd.MMM.yyyy")

    Dim entero = txtEntero.AsInteger
    LabelEntero.Text = $"{entero} * 2 = " & (entero * 2).ToString
End Sub
\f0


private void btnConvertir_Click(object sender, EventArgs e)
{
    var fecha = txtFecha.AsDate();
    LabelFecha.Text = "La fecha + 1 día = " + fecha.AddDays(1).ToString("dddd, dd.MMM.yyyy");
    var entero = txtEntero.AsInteger();
    LabelEntero.Text = $"{entero} * 2 = " + (entero * 2).ToString();
}

Solo comentar que si los métodos de extensión están en otro espacio de nombres distinto al de la aplicación donde se usan, habrá que hacer una importación de ese espacio de nombres para que esos métodos estén accesibles.
Pero esto es algo «sabido», ya que aquí es como si usáramos el código de cualquier otra clase «estática/compartida»: si queremos acceder a los miembros que define debemos tener acceso a esa clase.

Y esto es todo… espero que te sea de utilidad.

Nos vemos.
Guillermo