Extension Methods C#

¿Qué son y para qué sirven?

Los extension methods son métodos estáticos que se utilizan como para extender el comportamiento de tipos existentes cuando no es posible utilizar herencia o modificar el código original de ninguna forma.

Si bien es un forma eficiente y prolija de solucionar el problema mencionado anteriormente, hay que tener en cuenta un detalle muy importante, si el código de la clase a la cual le creamos la extensión es modificado, es muy probable que nuestro extension method deje de funcionar correctamente.

Ejemplo extendiendo List<int>

A continuación, dos pequeños ejemplos de Extension Methods, uno con parámetros y otro sin.

La idea en el primer ejemplo es extender el tipo List<int> para poder obtener fácilmente solo los números pares incluidos en la lista y el segundo ejemplo buscará obtener los números pares mayores a un número X ingresado por parámetro.

Primero se agrega una clase ExtensionMethodExample estática que contiene 2 extension methods uno GetPairNumbers que solo retorna los números pares de la lista ingresada por parámetro y el segundo GetPairNumbersGratherThan que solamente retornará los números pares superiores a la variable minValue.

Declaramos el método estático como cualquier otro, pero en el primer parámetro luego de la palabra this debemos especificar el tipo que queremos extender, en este caso List<int>.

Luego dentro del método se escribe nuestra lógica que corresponda y retornamos el tipo específico indicado en la firma del método, en este caso List<int>.

En este caso particular queda como tipo de retorno el mismo que estoy extendiendo, pero esto no tiene porque ser así, el extension method puede retornar cualquier tipo como cualquier otro método.

public static class ExtensionMethodExample
    {
        public static List<int> GetPairNumbers(this List<int> lstNumbers)
        {
            return lstNumbers?.Where(x => x % 2 == 0).ToList();
        }

        public static List<int> GetPairNumbersGratherThan(this List<int> lstNumbers, int minValue)
        {
            return lstNumbers?.Where(x => x % 2 == 0).Where(x => x > minValue).ToList();
        }
    }

Luego para utilizar estos extension methods escribí el siguiente código en consola.

Primero utilizo un List<int> lstNumbers con el conjunto inicial de datos, luego simplemente llamo a cada extension method cargando el resultado en listas auxiliares (pairNumbers y pairNumbersGrather10).

Y por último las recorro cada lista para imprimir en consola el resultado final.


static void Main(string[] args)
{
	List<int> lstNumbers = new List<int>{ 2, 4, 3, 5, 6, 8, 10, 13, 12, 22 };

	List<int> pairNumbers = lstNumbers.GetPairNumbers();
	List<int> pairNumbersGrather10 = lstNumbers.GetPairNumbersGratherThan(10);

	Console.WriteLine("Pair Numbers");
	foreach(var item in pairNumbers)
	{
		Console.WriteLine(item);
	}

	Console.WriteLine("Pair Numbers Grather than 10");
	foreach(var item in pairNumbersGrather10)
	{
		Console.WriteLine(item);
	}

	Console.ReadLine();
}

El resultado obtenido es el siguiente.

CSharp.ExtensionMethods – Nuget Package

Hace un tiempo atrás conocí un proyecto open source vinculado con extension methods que puede ser muy útil, para ahorrar con alguna funcionalidad en particular.

Sobre alguno de los siguientes tipos Dates, Doubles, Enum, Generics.

Por ejemplo para Dates existen alguna de las siguientes funciones:

  • Between
  • GetFirstDayOfWeek
  • IsWeekday
  • IsWeekend
  • NextWeekDay, etc.

Este es el link del repo en Github, el autor se llama Prasad Honrao. Y este es el link del recurso en Nuget.

 

Conclusión

Los extension methods son una solución eficiente y elegante para extender el comportamiento de un código existente.

Pero hay que tener cuidado ya que si el tipo que estamos extendiendo cambia, esto puede romper nuestro código.