Una de las características del nuevo C#, es que hacen posible agregarle más métodos a una clase base, sin tener la necesidad de escribirlos dentro de esta ni recurrir a la herencia. Por ejemplo, a la clase String le podrías añadir métodos como; IsMail, ShowInMessageBox…
Para hacerlo, existen varias condiciones que se deben cumplir:
· La clase que contiene los métodos extensores, debe ser declarada como static.
· Los métodos extensores, también deben ser static.
· Si un método extensor quiere extender la clase String, deberá tener un parámetro del mismo tipo precedido de la palabra this, que es la clave para que el compilador entienda que existe un método extensor.
Entendidas las condiciones a cumplir, vamos a ir “step by step” a crear nuestro primer método extensor:
static class Extiende
{
public static bool IsMail(this System.String stg)
{
Regex regex = null;
regex = new Regex(@”^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$”);
return regex.IsMatch(stg);
}
}
Una vez creado el método extensor, este podrá ser utilizado en instancias del tipo de la clase extendida, para este caso, para la clase String:
class Program
{
static void Main(string[] args)
{
String muestra = String.Empty;
muestra = “sample@contoso.com”;
Console.WriteLine(muestra.IsMail());
Console.ReadLine();
}
}
Cuando se crea el objeto muestra de la clase extendida, si hacemos uso del propio método, veremos como el Intellisense de Visual Studio nos informa de qué métodos extensores de la clase están disponibles:
Aunque estos métodos son muy potentes, deben ser utilizados con precaución. Os menciono la guía de mis “mejores prácticas” para esta novedad:
· Los métodos extensores, no pueden ser sustitutos de la herencia ni para los métodos de una instancia. Solo deben utilizarse en aquellos casos en los que no sea posible o inadecuado utilizar un método de una instancia. No se deben utilizar como una norma para la resolución de estos casos ni mucho menos en sistemas complejos.
· Pon siempre todos tus métodos extensores en un espacio de nombres propio, como por ejemplo: MyLibrary.Extensiones
· Si deberían ser utilizadas como métodos extensores sobre los tipos de datos básicos tal y como se muestra en el ejemplo.
Además, si estos se utilizan dentro de un espacio de nombres propio y extienden funcionalidades de tipos de datos básicos, podemos crear una librería interna para nuestros desarrollos y aprovechar la comodidad de la reutilización de código. Aún y con esto, debemos tener especial cuidado con estos tipos de librerías, ya que en un sistema de programación complejo con muchas librerías, pueden causar una pequeña latencia en nuestro desarrollo.
Tenemos la tecnología, pero debemos saber usarla bien y conocer muy bien el entorno en que lo vamos a usar.
¡Gracias a todos los lectores que me animáis día a día a escribir!
Referencias utilizadas: System, System.Text, System.Text.RegularExpressions
Framework: v3.0 o v3.5
Entorno: Microsoft Visual Studio 2008 en cualquiera de sus versiones
Lenguaje: C# (también disponible para VB .net con la sintaxis correspondiente)

5 respuestas hasta el momento ↓
chema // Julio 16, 2009 a 8:56 am |
Hola.
Muy buen ejemplo de las extensiones.
Yo lo he utilizado para lo siguiente y quisera que me dijeras si es correcto.
El objeto IIdentity guarda en la propiedad name el nombre del usuario logeado, y a mi me interesaba tambien guardar de ese usuario su nombre y apellidos, y me cree un extensor para este objeto, de ese modo con el objeto LoginName en vez de mostrar el campo user del usuario mostrar su nombre y apellidos.
Un saludo.
fjaumot // Agosto 3, 2009 a 8:20 pm |
Hola chema,
No, se debería usar así. Los métodos extensores deben servir para ampliar funcionalidad a la clase que desees, no para añadir propiedades a una clase. Para eso lo correo es heredar de ella y implementarte tu propia clase IIdentity.
Gracias,
Jesus // Agosto 29, 2009 a 9:34 am |
Pensaba que me serviría para un tema de XNA, pero el hecho de que deban ser métodos estáticos no me acaba de convencer.. para segun que tipos de aplicaciones sí por eso.
Salut
Set SelectedValue in DataList - Fran Otero // Septiembre 20, 2009 a 8:50 pm |
[...] trata de un método extensor que recorrerá los elementos de la colección buscando coincidencias de clave, y una [...]
Los métodos extensores. « a deshoras // Septiembre 30, 2009 a 8:23 pm |
[...] Bajate el código y échale un ojo, y cuando uses este tipo de metodos, cuidado, ten en cuenta que no estan pensandos para sustituir la funcionalidad que nos proporciona la herencia, y como bien dicen aquí, es interesante agruparlos en un mismo namespace (que uno única clase). [...]