How can I cast int to enum?

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

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

相关标签:
30条回答
  • 2020-11-22 01:04

    You just do like below:

    int intToCast = 1;
    TargetEnum f = (TargetEnum) intToCast ;
    

    To make sure that you only cast the right values ​​and that you can throw an exception otherwise:

    int intToCast = 1;
    if (Enum.IsDefined(typeof(TargetEnum), intToCast ))
    {
        TargetEnum target = (TargetEnum)intToCast ;
    }
    else
    {
       // Throw your exception.
    }
    

    Note that using IsDefined is costly and even more than just casting, so it depends on your implementation to decide to use it or not.

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

    From an int:

    YourEnum foo = (YourEnum)yourInt;
    

    From a string:

    YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString);
    
    // The foo.ToString().Contains(",") check is necessary for enumerations marked with an [Flags] attribute
    if (!Enum.IsDefined(typeof(YourEnum), foo) && !foo.ToString().Contains(","))
    {
        throw new InvalidOperationException($"{yourString} is not an underlying value of the YourEnum enumeration.")
    }
    

    Update:

    From number you can also

    YourEnum foo = (YourEnum)Enum.ToObject(typeof(YourEnum) , yourInt);
    
    0 讨论(0)
  • 2020-11-22 01:05

    For numeric values, this is safer as it will return an object no matter what:

    public static class EnumEx
    {
        static public bool TryConvert<T>(int value, out T result)
        {
            result = default(T);
            bool success = Enum.IsDefined(typeof(T), value);
            if (success)
            {
                result = (T)Enum.ToObject(typeof(T), value);
            }
            return success;
        }
    }
    
    0 讨论(0)
  • 2020-11-22 01:06

    I don't know anymore where I get the part of this enum extension, but it is from stackoverflow. I am sorry for this! But I took this one and modified it for enums with Flags. For enums with Flags I did this:

      public static class Enum<T> where T : struct
      {
         private static readonly IEnumerable<T> All = Enum.GetValues(typeof (T)).Cast<T>();
         private static readonly Dictionary<int, T> Values = All.ToDictionary(k => Convert.ToInt32(k));
    
         public static T? CastOrNull(int value)
         {
            T foundValue;
            if (Values.TryGetValue(value, out foundValue))
            {
               return foundValue;
            }
    
            // For enums with Flags-Attribut.
            try
            {
               bool isFlag = typeof(T).GetCustomAttributes(typeof(FlagsAttribute), false).Length > 0;
               if (isFlag)
               {
                  int existingIntValue = 0;
    
                  foreach (T t in Enum.GetValues(typeof(T)))
                  {
                     if ((value & Convert.ToInt32(t)) > 0)
                     {
                        existingIntValue |= Convert.ToInt32(t);
                     }
                  }
                  if (existingIntValue == 0)
                  {
                     return null;
                  }
    
                  return (T)(Enum.Parse(typeof(T), existingIntValue.ToString(), true));
               }
            }
            catch (Exception)
            {
               return null;
            }
            return null;
         }
      }
    

    Example:

    [Flags]
    public enum PetType
    {
      None = 0, Dog = 1, Cat = 2, Fish = 4, Bird = 8, Reptile = 16, Other = 32
    };
    
    integer values 
    1=Dog;
    13= Dog | Fish | Bird;
    96= Other;
    128= Null;
    
    0 讨论(0)
  • 2020-11-22 01:07

    The following is a slightly better extension method:

    public static string ToEnumString<TEnum>(this int enumValue)
    {
        var enumString = enumValue.ToString();
        if (Enum.IsDefined(typeof(TEnum), enumValue))
        {
            enumString = ((TEnum) Enum.ToObject(typeof (TEnum), enumValue)).ToString();
        }
        return enumString;
    }
    
    0 讨论(0)
  • 2020-11-22 01:07

    It can help you to convert any input data to user desired enum. Suppose you have an enum like below which by default int. Please add a Default value at first of your enum. Which is used at helpers medthod when there is no match found with input value.

    public enum FriendType  
    {
        Default,
        Audio,
        Video,
        Image
    }
    
    public static class EnumHelper<T>
    {
        public static T ConvertToEnum(dynamic value)
        {
            var result = default(T);
            var tempType = 0;
    
            //see Note below
            if (value != null &&
                int.TryParse(value.ToString(), out  tempType) && 
                Enum.IsDefined(typeof(T), tempType))
            {
                result = (T)Enum.ToObject(typeof(T), tempType); 
            }
            return result;
        }
    }
    

    N.B: Here I try to parse value into int, because enum is by default int If you define enum like this which is byte type.

    public enum MediaType : byte
    {
        Default,
        Audio,
        Video,
        Image
    } 
    

    You need to change parsing at helper method from

    int.TryParse(value.ToString(), out  tempType)
    

    to

    byte.TryParse(value.ToString(), out tempType)

    I check my method for following inputs

    EnumHelper<FriendType>.ConvertToEnum(null);
    EnumHelper<FriendType>.ConvertToEnum("");
    EnumHelper<FriendType>.ConvertToEnum("-1");
    EnumHelper<FriendType>.ConvertToEnum("6");
    EnumHelper<FriendType>.ConvertToEnum("");
    EnumHelper<FriendType>.ConvertToEnum("2");
    EnumHelper<FriendType>.ConvertToEnum(-1);
    EnumHelper<FriendType>.ConvertToEnum(0);
    EnumHelper<FriendType>.ConvertToEnum(1);
    EnumHelper<FriendType>.ConvertToEnum(9);
    

    sorry for my english

    0 讨论(0)
提交回复
热议问题