2014-10-09

C#- Vitaminiza tus enums con métodos de extensión

***********************************************
Post copiado integramente
C#- Vitaminiza tus enums con métodos de extensión
Publicado 9/10/2014 10:53 por Eduard Tomàs i Avellana
*********************************************
Buenas, un post cortito y sencillito ;)
En C# los enums son relativamente limitados: básicamente se limitan a tener un conjunto de valores y nada más. En otros lenguajes como Java o Swift, los enums pueden declarar métodos.
A priori puede parecer que no es muy necesario que un enum tenga un método, y de hecho no es algo que se suela echar en falta. Pero en algunos casos puede ser útil, especialmente para tener nuestro código más bien organizado.
P. ej. imagina un enum que contuviese los valores de los puntos cardinales:
public enum FacingOrientation
{
    North = 0,
    East = 1,
    South = 2,
    West = 3
}
Ahora podríamos requerir un método que nos devolviese el siguiente punto cardinal, en sentido horario. Es decir si estamos mirando al norte y giramos en sentido horario, estaremos mirando al este.
Este método sería un candidato para estar en el propio enum para que así pudiese hacer tener código como el siguiente:
var orientation = FacingOrientation.South;
var neworientation = orientation.Turn(1);

El método Turn devolvería la nueva orientación después de N giros en sentido horario.
Como he dicho antes en C# esto no es directamente posible porque los enums no pueden contener métodos. Pero por suerte si que podemos declarar un método de extensíón sobre un enum específico:

public static FacingOrientation Turn(this FacingOrientation orientation, int steps)
{
    var idx = (int)orientation;
    idx += steps;
    return (FacingOrientation)(idx % 4);
}
Y el resultado es a todos los efectos casi idéntico :)
Saludos!

No hay comentarios: