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.
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.
NOTA:
Los despistes del Guille… resulta que después de publicar este artículo sobre los métodos de extensión, me olvidé… y hace poco (el 24-ago-2020, estoy escribiendo esto el 29 de agosto de 2020) escribí otro artículo sobre el mismo tema… pero con más ejemplos… Te dejo aquí el enlace por si te sirve para aclarar más aún este tema… en fin… ¡la cabeza del Guille! 😉
Nos vemos.
Guillermo
Valla Guille muchas gracias por escribir este artÃculo, ha sido de mucha utilidad y por fin he podido entender de forma muy clara y precisa las extensiones, ¡gracias!
gracias a ti por leerlo 🙂
hola, buenas tardes Guillermo, buen aporte estoy iniciando en visual basic para autocad, ver si podria restaurar el link de descarga de o de los archivos, segun el encabeza do «Manejar dibujos de AutoCAD en tus aplicaciones», MTBViewerX.OCX, o si podria enviarmelo a mi correo ALYNSON21@GMAIL.COM
Hola, yo no tengo ese control… y he comprobado que el enlace no funciona 🙁
Pero puedes escribirle al autor (espero que te responda): ManelTB (mtb@mtbsoftware.net)
Gracias