How can I cast int to enum?

后端 未结 30 1520
礼貌的吻别
礼貌的吻别 2020-11-22 00:56

How can an int be cast to an enum in C#?

相关标签:
30条回答
  • 2020-11-22 00:59

    If you have an integer that acts as a bitmask and could represent one or more values in a [Flags] enumeration, you can use this code to parse the individual flag values into a list:

    for (var flagIterator = 0; flagIterator < 32; flagIterator++)
    {
        // Determine the bit value (1,2,4,...,Int32.MinValue)
        int bitValue = 1 << flagIterator;
    
        // Check to see if the current flag exists in the bit mask
        if ((intValue & bitValue) != 0)
        {
            // If the current flag exists in the enumeration, then we can add that value to the list
            // if the enumeration has that flag defined
            if (Enum.IsDefined(typeof(MyEnum), bitValue))
                Console.WriteLine((MyEnum)bitValue);
        }
    }
    

    Note that this assumes that the underlying type of the enum is a signed 32-bit integer. If it were a different numerical type, you'd have to change the hardcoded 32 to reflect the bits in that type (or programatically derive it using Enum.GetUnderlyingType())

    0 讨论(0)
  • 2020-11-22 01:00

    Take the following example:

    int one = 1;
    MyEnum e = (MyEnum)one;
    
    0 讨论(0)
  • 2020-11-22 01:00

    You simply use Explicit conversion Cast int to enum or enum to int

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine((int)Number.three); //Output=3
    
            Console.WriteLine((Number)3);// Outout three
            Console.Read();
        }
    
        public enum Number
        {
            Zero = 0,
            One = 1,
            Two = 2,
            three = 3
        }
    }
    
    0 讨论(0)
  • 2020-11-22 01:02

    Below is a nice utility class for Enums

    public static class EnumHelper
    {
        public static int[] ToIntArray<T>(T[] value)
        {
            int[] result = new int[value.Length];
            for (int i = 0; i < value.Length; i++)
                result[i] = Convert.ToInt32(value[i]);
            return result;
        }
    
        public static T[] FromIntArray<T>(int[] value) 
        {
            T[] result = new T[value.Length];
            for (int i = 0; i < value.Length; i++)
                result[i] = (T)Enum.ToObject(typeof(T),value[i]);
            return result;
        }
    
    
        internal static T Parse<T>(string value, T defaultValue)
        {
            if (Enum.IsDefined(typeof(T), value))
                return (T) Enum.Parse(typeof (T), value);
    
            int num;
            if(int.TryParse(value,out num))
            {
                if (Enum.IsDefined(typeof(T), num))
                    return (T)Enum.ToObject(typeof(T), num);
            }
    
            return defaultValue;
        }
    }
    
    0 讨论(0)
  • 2020-11-22 01:03

    You should build in some type matching relaxation to be more robust.

    public static T ToEnum<T>(dynamic value)
    {
        if (value == null)
        {
            // default value of an enum is the object that corresponds to
            // the default value of its underlying type
            // https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/default-values-table
            value = Activator.CreateInstance(Enum.GetUnderlyingType(typeof(T)));
        }
        else if (value is string name)
        {
            return (T)Enum.Parse(typeof(T), name);
        }
    
        return (T)Enum.ToObject(typeof(T),
                 Convert.ChangeType(value, Enum.GetUnderlyingType(typeof(T))));
    }
    

    Test Case

    [Flags]
    public enum A : uint
    {
        None  = 0, 
        X     = 1 < 0,
        Y     = 1 < 1
    }
    
    static void Main(string[] args)
    {
        var value = EnumHelper.ToEnum<A>(7m);
        var x = value.HasFlag(A.X); // true
        var y = value.HasFlag(A.Y); // true
    
        var value2 = EnumHelper.ToEnum<A>("X");
    
        var value3 = EnumHelper.ToEnum<A>(null);
    
        Console.ReadKey();
    }
    
    0 讨论(0)
  • 2020-11-22 01:03

    Here's an extension method that casts Int32 to Enum.

    It honors bitwise flags even when the value is higher than the maximum possible. For example if you have an enum with possibilities 1, 2, and 4, but the int is 9, it understands that as 1 in absence of an 8. This lets you make data updates ahead of code updates.

       public static TEnum ToEnum<TEnum>(this int val) where TEnum : struct, IComparable, IFormattable, IConvertible
        {
            if (!typeof(TEnum).IsEnum)
            {
                return default(TEnum);
            }
    
            if (Enum.IsDefined(typeof(TEnum), val))
            {//if a straightforward single value, return that
                return (TEnum)Enum.ToObject(typeof(TEnum), val);
            }
    
            var candidates = Enum
                .GetValues(typeof(TEnum))
                .Cast<int>()
                .ToList();
    
            var isBitwise = candidates
                .Select((n, i) => {
                    if (i < 2) return n == 0 || n == 1;
                    return n / 2 == candidates[i - 1];
                })
                .All(y => y);
    
            var maxPossible = candidates.Sum();
    
            if (
                Enum.TryParse(val.ToString(), out TEnum asEnum)
                && (val <= maxPossible || !isBitwise)
            ){//if it can be parsed as a bitwise enum with multiple flags,
              //or is not bitwise, return the result of TryParse
                return asEnum;
            }
    
            //If the value is higher than all possible combinations,
            //remove the high imaginary values not accounted for in the enum
            var excess = Enumerable
                .Range(0, 32)
                .Select(n => (int)Math.Pow(2, n))
                .Where(n => n <= val && n > 0 && !candidates.Contains(n))
                .Sum();
    
            return Enum.TryParse((val - excess).ToString(), out asEnum) ? asEnum : default(TEnum);
        }
    
    0 讨论(0)
提交回复
热议问题