Después de investigar en diferentes repositorios y sitios webs al final dimos con la solución que te compartimos aquí.
Solución:
Gracias a todos por sus respuestas y comentarios. Me sorprendió recibir tantos de ellos. Mirándolos y usando algunas de las ideas, se me ocurrió esta solución, que funciona mejor para mí:
public static class Extensions
public static T Next(this T src) where T : struct
if (!typeof(T).IsEnum) throw new ArgumentException(String.Format("Argument 0 is not an Enum", typeof(T).FullName));
T[] Arr = (T[])Enum.GetValues(src.GetType());
int j = Array.IndexOf(Arr, src) + 1;
return (Arr.Length==j) ? Arr[0] : Arr[j];
La belleza de este enfoque, que es simple y universal de usar. Implementado como método de extensión genérico, puede llamarlo en cualquier enumeración de esta manera:
return eRat.B.Next();
Tenga en cuenta que estoy usando un método de extensión generalizado, por lo que no necesito especificar el tipo en la llamada, solo .Next()
.
Probablemente un poco exagerado, pero:
eRat value = eRat.B;
eRat nextValue = Enum.GetValues(typeof(eRat)).Cast()
.SkipWhile(e => e != value).Skip(1).First();
o si quieres el primero que sea numéricamente más grande:
eRat nextValue = Enum.GetValues(typeof(eRat)).Cast()
.First(e => (int)e > (int)value);
o para el siguiente más grande numéricamente (haciendo la clasificación nosotros mismos):
eRat nextValue = Enum.GetValues(typeof(eRat)).Cast()
.Where(e => (int)e > (int)value).OrderBy(e => e).First();
Oye, con LINQ como tu martillo, el mundo está lleno de clavos ;-p
Vos si De Verdad ¿Necesitas generalizar este problema? ¿Puedes hacer esto en su lugar?
public void SomeMethod(MyEnum myEnum)
MyEnum? nextMyEnum = myEnum.Next();
if (nextMyEnum.HasValue)
...
public static MyEnum? Next(this MyEnum myEnum)
switch (myEnum)
case MyEnum.A:
return MyEnum.B;
case MyEnum.B:
return MyEnum.C;
case MyEnum.C:
return MyEnum.D;
default:
return null;
Sección de Reseñas y Valoraciones
Nos puedes añadir valor a nuestro contenido informacional asistiendo con tu experiencia en las notas.