Lilypie Primer PicLilypie Primer Ticker

jueves, 8 de noviembre de 2007

.NET Framework 3: Extension Methods

Una innovación interesante de la versión 3.0 del .NET Framework son los denominados Extension Methods.

Para entender el concepto, tomemos la clase System.String. Esta clase tiene una gran cantidad de métodos que nos permiten realizar muchas operaciones sobre las cadenas. Sin embargo, en ocasiones he necesitado invertir una cadena, y después de escarbar por un buen rato, tuve que aceptar resignado que esta clase no implementa un método que permita realizar esta operación.

Analicemos un par de alternativas para solucionar este problema.

1. Crear una clase derivada de String e implementar un método Reverse() en ella. Esta opción no es viable en este caso concreto porque la clase String está sellada (sealed) por lo que no admite clases derivadas.

2. Implementar una biblioteca que incluya un método ReverseString y pasarle la cadena como parámetro, asi:

public class MyLib
{
public static string ReverseString(string s)
{
// el código aqui.
}
}

Entonces invocaríamos al método de esta manera:

string rev = MyLib.ReverseString("Cadena a invertir"');

Esta alternativa cumple con el propósito, pero es algo incómoda de usar, sería mucho más conveniente contar con el método Reverse() implementado directamente en la clase String.

Aqui es donde los Extension Methods hacen su aparición, ya que permiten añadir funcionalidades a un tipo existente del CLR sin necesidad de crear una clase derivada ni de recompilar el tipo original. Entonces un Extension Method nos permitiría hacer una llamada como esta:

string rev = miCadena.Reverse();

o incluso:
string rev = "Cadena a invertir".Reverse();
Veamos entonces como se implementa un Extension Method:

public static class MisExtensiones
{
public static string Reverse(this string s)
{
string buffer = "";
foreach (char c in s.ToCharArray())
{
buffer
= c.ToString() + buffer;
}
return buffer;
}
}

Este código nos permite hacer algunas precisiones respecto a la forma de implementar los Extension Methods:

  • Deben ser definidos dentro de una clase estática.
  • Deben ser declarados estáticos.
  • Toman como parámetro el tipo que se quiere extender precedido de la palabra reservada this.

Nada más, cumpliendo esos pocos requisitos podemos extender cualquier clase del .NET Framework.

Veamos un ejemplo interesante, tomado del este post del blog de ScottGu:


public static bool In(this object o, IEnumerable c)
{
foreach (object i in c)
{
if (i.Equals(o))
{
return true;
}
}
return false;
}

Este método extiende la clase Object y nos permite saber si un objeto está contenido dentro de una colección. Invocamos el método asi:

bool isInArray = miObjeto.In(miColeccion);

Lo más interesante es que al extender una clase, la nueva funcionalidad también estará disponible en todas sus clases derivadas. Entonces al aplicar esta técnica en las clases base adecuadas, podremos extender el .NET Framework de forma limpia, ordenada y transparente.

No hay comentarios.: