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

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:

  1. public enum FacingOrientation
  2. {
  3.     North = 0,
  4.     East = 1,
  5.     South = 2,
  6.     West = 3
  7. }

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:

  1. var orientation = FacingOrientation.South;
  2. 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:

  1. public static FacingOrientation Turn(this FacingOrientation orientation, int steps)
  2. {
  3.     var idx = (int)orientation;
  4.     idx += steps;
  5.     return (FacingOrientation)(idx % 4);
  6. }

Y el resultado es a todos los efectos casi idéntico 🙂

Saludos!

2 comentarios sobre “C#- Vitaminiza tus enums con métodos de extensión”

  1. Buen post Juanma!! 🙂

    Aunque de hecho desde Java5 creo, los enums aceptan métodos y realmente no es muy necesaria la aproximación de tener los N valores como «constantes»… En Java digo… en c# para casos complejos tu aproximación es más que válida!

    Un saludo!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *