7.27.2011

Métodos de Extensión en .NET

¿A quién no le ha pasado la siguiente situación?

Empiezo a programar un método para que haga X cosa, de pronto me doy cuenta que necesito una función que no existe en esa clase. ¿Qué hago? Si puedo heredarla, la heredo y agrego el método, con el consiguiente problema de que si requerimos que todos los desarrolladores la usen, deben de olvidarse de utilizar la clase “estándar” y empezar a usar la clase que acabo de crear. Por otro lado, si la clase esta sellada –sealed – no la puedo heredar, lo que conlleva a crear alguna clase “Helper” que tenga el método y pueda ser invocada. Por ejemplo, supongamos que necesito saber si un string es numérico o no. En este caso procedo a crear un método en una clase Helper dado que la clase string esta sellada en .NET – es decir, no se puede heredar.

image

Ahora, para utilizar este método estático, simplemente lo hago de la siguiente forma:

image

El problema con esta solución es que todo el mundo debe de estar consciente que esta clase existe y que se puede reutilizar – esa palabra por la cual todos vivimos pero casi nunca logramos aplicar de forma constante en nuestros desarrollos – por lo cual es muy probable que veamos la misma solución aplicada de diversas formas en otros proyectos internos.

La Solución

Sin embargo, a partir de la versión del framework 3.5 se agregó una característica que personalmente utilizo mucho y pienso que es de gran utilidad: los métodos de extensión. Esto métodos de extensión son métodos que pueden formar parte de una clase y pueden ser utilizados directamente desde la instancia o el tipo de la misma. Esta característica se utiliza muchísimo sobre todo en el desarrollo de LINQ. Para entender este concepto vamos a modificar el ejemplo anterior para convertirlo en un método de extensión. Lo único que tenemos que hacer es modificar la forma en que declaramos el parámetro del método IsNumeric, tal y como se puede ver en el siguiente código:

image

Como podemos ver en el código anterior, lo único que hice fue agregarle la palabra reservada this al parámetro del método. Esto convierte el método en una extensión de la clase string, con lo cual puedo utilizarlo directamente en las instancias de este tipo de dato.

image

Etiquetas de Technorati: ,

1 comentario:

Anónimo dijo...

muy bueno eso de los metodos de extension, solo hago una observacion, que los metodos de extension solo se pueden ser declarados en clases estaticas ;D