How can I cast int to enum?

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

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

30条回答
  •  面向向阳花
    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(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()
                .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);
        }
    

提交回复
热议问题