miércoles, 11 de enero de 2012

Metodos de extension en C#

Hace algún tiempo que vengo trabajando con C# y he visto algo que en mi opinión es bastante útil y se llama métodos de extensión. Por medio de estos métodos podemos hacer algo como lo que ofrece Ruby y extender las interfaces de las clases que vienen incluidas como parte del .Net framework.

Veamos algunos ejemplos donde esto puede ser útil.
1. Extendiendo linq, supongamos que queremos calcular el hash de una cadena, podemos definir un método de la siguiente forma para obtener el hash md5


2.  Leer los AppSettings (xml) de una aplicación.


¿Qué hay de malo con los ejemplos?
Como estos son ejemplos simples no mucho en realidad, pero en ejemplo 1 se podría reusar la lógica de conversión de byte a hexadecimal y en el ejemplo 2 en todos lados donde se use la función GetAppSetting debemos saber exactamente que cadena hay que pasar como parámetro para obtener el setting deseado y si por si acaso alguien escribe mal la llave (key) la aplicación fallará pues la función GetAppSetting retornará null.

Pues bien mejoremos el código
Voy a crear una sola clase con mis métodos de extensión, sin embargo ustedes pueden separar todo en varias clases según sea necesario.

Nota: Del ejemplo anterior pueden ver que tengo una clase y un enum definidos. La clase define los métodos de extensión mientras que el enum es usado para simplificar el código de acceso a las configuraciones, veamos como quedan las las funciones que vimos antes:

Ejemplo 1:

Nota: Como pueden ver aquí, la función en si misma se hace más simple y de ahora en adelante donde sea que tengamos una instancia de IEnumerable podemos llamar al método ToHexString .
Muchas cosas puede usarse como instancias de IEnumerable, un arreglo, una lista, una colección (ICollection), etc.

Ejemplo 2:

Nota:  Ahora en la función delegamos el acceso a los AppSettings a nuestro enum, de esta forma existe un solo lugar donde se leen los mismo y eliminamos la necesidad de mantener una cadena o una constante  aparte solo para el nombre de una configuración. Ademas con esta solución podemos usar el autocompletado de nuestro IDE favorito.