Convert enums

CSharp · Console

/Program.cs

using System;
using System.Linq;

namespace Example
{
    public enum General : int
    {
        One = 0,
        Two = 1,
        Three = 2,
        Four = 4,
        Five = 8
    }

    public enum A : int
    {
        One = General.One,
        Two = General.Two,
        Three = General.Three,
        Four = General.Four,
    }

    public enum B : int
    {
        Three = General.Three,
        Four = General.Four,
        Five = General.Five
    }

    public enum C : int
    {
        One = General.One,
        Three = General.Three,
        Five = General.Five
    }

    static public class ExtensionMethods
	{
		static public General ToGeneral<T>(this T input) where T : struct, IConvertible
		{
			if (!typeof(T).IsEnum) throw new ArgumentException("Input must be an enum.");
			
			return (General)((int)(object)input & Enum.GetValues(typeof(General)).Cast<int>().Sum());
		}
		
		static public T ToEnum<T>(this General input)
		{
			if (!typeof(T).IsEnum) throw new ArgumentException("Output type must be an enum.");

            return (T)Enum.ToObject(typeof(T), (int)input & Enum.GetValues(typeof(T)).Cast<int>().Sum());
		}
	}
	
	public class Program
	{
		static public TOut Convert<TIn,TOut>(TIn input) where TIn : struct, IConvertible where TOut: struct, IConvertible
		{
			var general = input.ToGeneral();
			return general.ToEnum<TOut>();
		}
		
		public static void Main()
		{
		
			A valAsA = A.One | A.Three | A.Four;
			B valAsB = Convert<A,B>(valAsA);  // Should give me "B.Three | B.Four"
			C valAsC = Convert<A,C>(valAsA); // Should give me "C.One | C.Three"
			
			Console.WriteLine("{0} should equal {1}", valAsB, (B.Three | B.Four));
			Console.WriteLine("{0} should equal {1}", valAsC, (C.One | C.Three));
		}
	}
}
;