Rolling Enum
Allgemein C# .Net
Rolling Enum, was sollen das ?
Es gibt ja sehr viele Enums, welche man sich definiert z.B. enum Direction { North, East, South, West }....
Diese Enums kann man ja in- und decrementieren, aber dann immer die if's zu schreiben ist ja auf Dauer auch nicht spannend.....
Kategorie Rolling Enum, was sollen das ?
Es gibt ja sehr viele Enums, welche man sich definiert z.B. enum Direction { North, East, South, West }....
Diese Enums kann man ja in- und decrementieren, aber dann immer die if's zu schreiben ist ja auf Dauer auch nicht spannend.....
Hier eine Möglichkeit, wie die man mittels
Generic auch auf mehrere anwenden kann .....
enum direction { North=1, East=2, South=3, West=4 };
public static T NormalizeEnum<T>(T d) where T : struct, IConvertible
{
var values = Enum.GetValues(typeof(T));
int min = values.Cast<int>().Min();
int max = values.Cast<int>().Max();
if (max - min != values.Length - 1)
{
throw new InvalidOperationException("Enum contains gaps");
}
max = values.Length;
var value = (int)Enum.Parse(typeof(T), d.ToString()) -((min > 0) ? min : 0);
return (T)System.Enum.GetValues(typeof(T)).GetValue(((int)value % max + max) % max);
}
static void Main(string[] args)
{
direction a = direction.North;
System.Console.WriteLine(NormalizeEnum(a++));
System.Console.WriteLine(NormalizeEnum(a++));
System.Console.WriteLine(NormalizeEnum(a++));
System.Console.WriteLine(NormalizeEnum(a++));
System.Console.WriteLine(NormalizeEnum(a++));
a = direction.North;
System.Console.WriteLine(NormalizeEnum(a--));
System.Console.WriteLine(NormalizeEnum(a--));
System.Console.WriteLine(NormalizeEnum(a--));
System.Console.WriteLine(NormalizeEnum(a--));
System.Console.WriteLine(NormalizeEnum(a--));
System.Console.ReadLine();
}
enum direction { North=1, East=2, South=3, West=4 };
public static T NormalizeEnum<T>(T d) where T : struct, IConvertible
{
var values = Enum.GetValues(typeof(T));
int min = values.Cast<int>().Min();
int max = values.Cast<int>().Max();
if (max - min != values.Length - 1)
{
throw new InvalidOperationException("Enum contains gaps");
}
max = values.Length;
var value = (int)Enum.Parse(typeof(T), d.ToString()) -((min > 0) ? min : 0);
return (T)System.Enum.GetValues(typeof(T)).GetValue(((int)value % max + max) % max);
}
static void Main(string[] args)
{
direction a = direction.North;
System.Console.WriteLine(NormalizeEnum(a++));
System.Console.WriteLine(NormalizeEnum(a++));
System.Console.WriteLine(NormalizeEnum(a++));
System.Console.WriteLine(NormalizeEnum(a++));
System.Console.WriteLine(NormalizeEnum(a++));
a = direction.North;
System.Console.WriteLine(NormalizeEnum(a--));
System.Console.WriteLine(NormalizeEnum(a--));
System.Console.WriteLine(NormalizeEnum(a--));
System.Console.WriteLine(NormalizeEnum(a--));
System.Console.WriteLine(NormalizeEnum(a--));
System.Console.ReadLine();
}