Extension Methods

Una de las nuevas funcionalidades de C# 3.0 fue la posibilidad de ampliar los métodos de una clase ya existente. Con ello, conseguimos aprovechar al máximo las clases ya predeterminadas, añadiéndole alguna funcionalidad que nos es requerida para nuestra aplicación. De no ser así, deberíamos tener estos métodos en clases distintas y perderíamos esa unificación.

He recuperado un pequeño ejemplo de msdn, donde añadimos un nuevo método a la clase String con el que podemos contar las palabras de una cadena.

Para ello, he creado un proyecto web con un texbox y un botón. Añado un proyecto de tipo librería para almacenar mi clase “Extensions” dónde especifico el nuevo método que agregaré a esta clase. De esta manera puedo utilizar mis extensiones en cualquier otro proyecto que lo necesite.

using System;

namespace Extensions
{
    public static class Extensions
    {
        public static int ContarPalabras(this String str)
        {
            return str.Split(new[] {' ', '.', '?'}, StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }
}

Como podemos ver, creamos un método con el nombre que queremos que aparezca dentro de nuestra clase. Como parámetros (aquí está la clave) le indicamos que este método (this) pertenece a la clase String.
El contenido del mismo es exactamente igual que cualquier otro método. En este caso, lo único que hacemos es crearnos un array, a raíz de un split realizado a la cadena que está instanciada en nuestra clase String, y retornamos el tamaño de ese array, omitiendo los blancos.
Importamos la librería a nuestro proyecto web y, si nos creamos un String y comprobamos la lista de posibilidades nos aparecería lo siguiente:

extension

Para comprobar esta funcionalidad, defino un evento click para mi botón y recojo la cadena introducida por el usuario para comprobar su tamaño.

using System;
using Extensions;

namespace ExtensionMethod
{
    public partial class Default : System.Web.UI.Page
    {
       protected void btnContar_Click(object sender, EventArgs e)
        {
            string cad = txtCadena.Text;
            lblResult.Text = string.Format("La cadena tiene {0} palabra(s)", cad.ContarPalabras());
        }
    }
}

¡Saludos!