DECLARACIÓN:

Para declarar un método de extensión, tenemos que crear una clase estática, de la siguiente manera:

 

static public class MyExtensionMethods
{
    
}

 

Dentro de esta clase vamos a agregar todos nuestros métodos de extensión. No tienen mucha diferencia ni mucha magia diferente de los métodos convencionales, sólo tienen que tener un requerimiento: recibir por parámetro el tipo de dato donde se va a “insertar” dicho método. Pero, hay que pasarlo de una manera un tanto particular:

 

static public class MyExtensionMethods
{
    static public double ToRadians(this double source)
    {
        return source * Math.PI / 180;
    }
}

 

 

Noten que a simple vista es un método estático, creado dentro de una clase estática. Pero hay algo en particular que lo convierte en un método de extensión, y es ese “this” que tiene adicional. Fijense también que a ese “this” le sigue un tipo de dato (float en este caso). Este tipo de dato es al cual se le va a agregar el método de extensión.

En resumen, lo que dice la declaración es que al tipo de dato “float” se le agregue este método de extensión. El parámetro está indicando al tipo en sí mismo. O sea, que cuando ejecutemos el método de extensión, el valor del tipo de dato va a estar metido dentro de ese parámetro. O sea, que si el número vale 1.5f, al ejecutar el método “ToRadians()” (para convertir de grados a radianes), se pasará automáticamente como parámetro “1.5f”.

Vamos a hacer una prueba:

 

 

Fijense que en este ejemplo, no pasamos un parámetro en el llamado, puesto que se pasa automáticamente al invocar el método. De más está decir, que pueden pasarle parámetros adicionales, pero SIEMPRE el primero debe ser el tipo de dato donde se va a “inyectar” este método.

 

 

Ahora vamos a hacer algo un poco más complejo. Vamos a agregarle a todos los tipos que sean “List< T >” el método “Shuffle” para mezclar sus valores. Por ejemplo, si tenemos una lista de números [2, 5, 7, 3], podríamos mezclarla para obtener una combinación diferente, ya sea:

  • [3, 7, 5, 2]
  • [2, 5, 3, 7]
  • [2, 7, 5, 3]
  • [7, 2, 5, 3]

Y así cualquier combinación posible.

Primero vamos a agregar el método de extensión para que todos los tipos enumerables lo tengan.

 

 

Con esto agregamos el método “Shuffle” vacío. Como verán, si apretan el botón “Run” el código mostrará los números en el mismo orden que los pusimos. Lo que tenemos que hacer es completar el método. ¿Se animan a hacerlo ustedes? Les dejo abajo un botón para que vean la solución: