Приведите int к перечислению в C #

Как можно преобразовать int в enum в C #?

вопрос задан 27.08.2008
lomaxx
54778 репутация

21 ответов


  • 0 рейтинг

    Это может помочь вам преобразовать любые входные данные в желаемый пользователем enum . Предположим, у вас есть перечисление как ниже, которое по умолчанию int . Пожалуйста, добавьте Значение по умолчанию в начале вашего перечисления. Используется в методе helpers, когда не найдено совпадений с входным значением.

    public enum FriendType  
    {
        Default,
        Audio,
        Video,
        Image
    }
    
    public static class EnumHelper
    {
        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;
        }
    }
    

    Н. B: Здесь я пытаюсь разобрать значение в int, потому что enum по умолчанию int Если вы определите enum как этот, который имеет тип byte .

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

    Вам нужно изменить синтаксический анализ на вспомогательный метод с

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

    до

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

    Я проверяю свой метод для следующих входов

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

    извините за мой английский

    ответ дан reza.cse08, с репутацией 3263, 17.11.2016
  • 0 рейтинг

    Ниже немного лучше метод расширения

    public static string ToEnumString(this int enumValue)
            {
                var enumString = enumValue.ToString();
                if (Enum.IsDefined(typeof(TEnum), enumValue))
                {
                    enumString = ((TEnum) Enum.ToObject(typeof (TEnum), enumValue)).ToString();
                }
                return enumString;
            }
    
    ответ дан Kamran Shahid, с репутацией 1468, 16.12.2016
  • 0 рейтинг

    Я больше не знаю, где взять часть этого расширения enum, но это из stackoverflow. Я прошу прощения за это! Но я взял этот и изменил для перечислений с флагами. Для перечислений с флагами я сделал это:

      public static class Enum where T : struct
      {
         private static readonly IEnumerable All = Enum.GetValues(typeof (T)).Cast();
         private static readonly Dictionary 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;
         }
      }
    

    Пример:

    [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;
    
    ответ дан Franki1986, с репутацией 469, 7.01.2016
  • 0 рейтинг

    из строки:

    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.")
    

    От int:

    YourEnum foo = (YourEnum)yourInt;
    

    Обновление:

    С номера вы также можете

    YourEnum foo = (YourEnum)Enum.ToObject(typeof(YourEnum) , yourInt);
    
    ответ дан FlySwat, с репутацией 110216, 27.08.2008
  • 0 рейтинг

    Я думаю, чтобы получить полный ответ, люди должны знать, как внутри перечисления работают enums. СЕТЬ.

    Как все работает

    Перечисление в. NET - это структура, которая отображает набор значений (полей) в базовый тип (по умолчанию int). Тем не менее, вы можете выбрать целочисленный тип, к которому относится ваше перечисление:

    public enum Foo : short
    

    В этом случае перечисление сопоставляется с типом данных short, что означает, что оно будет сохранено в памяти как короткое и будет вести себя как короткое, когда вы используете его.

    Если вы посмотрите на это с точки зрения IL, перечисление (normal, int) выглядит так:

    .class public auto ansi serializable sealed BarFlag extends System.Enum
    {
        .custom instance void System.FlagsAttribute::.ctor()
        .custom instance void ComVisibleAttribute::.ctor(bool) = { bool(true) }
    
        .field public static literal valuetype BarFlag AllFlags = int32(0x3fff)
        .field public static literal valuetype BarFlag Foo1 = int32(1)
        .field public static literal valuetype BarFlag Foo2 = int32(0x2000)
    
        // and so on for all flags or enum values
    
        .field public specialname rtspecialname int32 value__
    }
    

    Обратите внимание, что value__ хранится отдельно от значений перечисления. В перечисленном выше перечислении Foo тип value__ - int16. Это в основном означает, что вы можете хранить все, что вы хотите в перечислении, , если типы соответствуют .

    На данный момент я хотел бы указать, что System.Enum является типом значения, что в основном означает, что BarFlag будет занимать 4 байта в памяти, а Foo будет занимать 2-е. г. размер базового типа (это на самом деле сложнее, но эй. , , ).

    Ответ

    Итак, если у вас есть целое число, которое вы хотите отобразить в перечисление, среда выполнения должна сделать только 2 вещи: скопировать 4 байта и назвать его как-нибудь иначе (имя перечисления). Копирование неявно, потому что данные хранятся как тип значения - это в основном означает, что если вы используете неуправляемый код, вы можете просто обмениваться перечислениями и целыми числами без копирования данных.

    Чтобы сделать это безопасным, я думаю, что лучше знать, что базовые типы являются одинаковыми или неявно конвертируемыми и чтобы гарантировать, что значения перечисления существуют (они не проверяются по умолчанию! ).

    Чтобы увидеть, как это работает, попробуйте следующий код:

    public enum MyEnum : int
    {
        Foo = 1,
        Bar = 2,
        Mek = 5
    }
    
    static void Main(string[] args)
    {
        var e1 = (MyEnum)5;
        var e2 = (MyEnum)6;
    
        Console.WriteLine("{0} {1}", e1, e2);
        Console.ReadLine();
    }
    

    Обратите внимание, что приведение к e2 также работает! С точки зрения компилятора выше это имеет смысл: поле value__ просто заполняется либо 5, либо 6, и когда Console.WriteLine вызывает ToString(), имя e1 разрешается, а имя e2 - нет.

    Если это не то, что вы хотели, используйте Enum.IsDefined(typeof(MyEnum), 6), чтобы проверить, соответствует ли значение, которое вы преобразуете, определенному перечислению.

    Также обратите внимание, что я явно говорю о базовом типе перечисления, даже если компилятор действительно проверяет это. Я делаю это, чтобы избежать неожиданностей в будущем. Чтобы увидеть эти сюрпризы в действии, вы можете использовать следующий код (на самом деле я видел, как это часто случается в коде базы данных):

    public enum MyEnum : short
    {
        Mek = 5
    }
    
    static void Main(string[] args)
    {
        var e1 = (MyEnum)32769; // will not compile, out of bounds for a short
    
        object o = 5;
        var e2 = (MyEnum)o;     // will throw at runtime, because o is of type int
    
        Console.WriteLine("{0} {1}", e1, e2);
        Console.ReadLine();
    }
    
    ответ дан atlaste, с репутацией 22210, 3.04.2014
  • 0 рейтинг

    Возьмем следующий пример:

    int one = 1;
    MyEnum e = (MyEnum)one;
    
    ответ дан abigblackman, с репутацией 951, 27.08.2008
  • 0 рейтинг

    Просто бросьте его:

    MyEnum e = (MyEnum)3;
    

    Вы можете проверить, находится ли он в диапазоне, используя Enum. IsDefined :

    if (Enum.IsDefined(typeof(MyEnum), 3)) { ... }
    
    ответ дан Matt Hamilton, с репутацией 159536, 27.08.2008
  • 0 рейтинг

    enter image description here

    Чтобы преобразовать строку в ENUM или int в константу ENUM, нам нужно использовать Enum. Функция разбора. Вот видео на YouTube https: // www. YouTube. ком / смотреть? v = 4nhx4VwdRDk , который фактически демонстрирует со строкой, и то же самое относится к int.

    Код выглядит так, как показано ниже, где «красный» - это строка, а «MyColors» - это цвет ENUM, который имеет цветовые константы.

    MyColors EnumColors = (MyColors)Enum.Parse(typeof(MyColors), "Red");
    
    ответ дан Shivprasad Koirala, с репутацией 15205, 5.02.2014
  • 0 рейтинг

    Если вы готовы к 4. 0 . NET Framework, есть новый Enum. Функция TryParse () , которая очень полезна и хорошо работает с атрибутом [Flags]. См. Enum. TryParse Method (String, TEnum%)

    ответ дан Ryan Russon, с репутацией 773, 1.11.2011
  • 0 рейтинг

    Это анализирует целые числа или строки в целевом перечислении с частичным соответствием в точке. NET 4. 0 используя дженерики, как в классе полезности Тавани выше. Я использую его для преобразования переменных командной строки, которые могут быть неполными. Поскольку перечисление не может быть нулевым, вы должны логически указать значение по умолчанию. Это можно назвать так:

    var result = EnumParser.Parse(valueToParse, MyEnum.FirstValue);
    

    Вот код:

    using System;
    
    public class EnumParser where T : struct
    {
        public static T Parse(int toParse, T defaultVal)
        {
            return Parse(toParse + "", defaultVal);
        }
        public static T Parse(string toParse, T defaultVal) 
        {
            T enumVal = defaultVal;
            if (defaultVal is Enum && !String.IsNullOrEmpty(toParse))
            {
                int index;
                if (int.TryParse(toParse, out index))
                {
                    Enum.TryParse(index + "", out enumVal);
                }
                else
                {
                    if (!Enum.TryParse(toParse + "", true, out enumVal))
                    {
                        MatchPartialName(toParse, ref enumVal);
                    }
                }
            }
            return enumVal;
        }
    
        public static void MatchPartialName(string toParse, ref T enumVal)
        {
            foreach (string member in enumVal.GetType().GetEnumNames())
            {
                if (member.ToLower().Contains(toParse.ToLower()))
                {
                    if (Enum.TryParse(member + "", out enumVal))
                    {
                        break;
                    }
                }
            }
        }
    }
    

    FYI: Вопрос был о целых числах, которые никто не упомянул, также будут явно преобразованы в Enum. TryParse ()

    ответ дан CZahrobsky, с репутацией 530, 30.07.2014
  • 0 рейтинг

    Различные способы приведения к и обратно Enum

    enum orientation : byte
    {
     north = 1,
     south = 2,
     east = 3,
     west = 4
    }
    
    class Program
    {
      static void Main(string[] args)
      {
        orientation myDirection = orientation.north;
        Console.WriteLine(“myDirection = {0}”, myDirection); //output myDirection =north
        Console.WriteLine((byte)myDirection); //output 1
    
        string strDir = Convert.ToString(myDirection);
            Console.WriteLine(strDir); //output north
    
        string myString = “north”; //to convert string to Enum
        myDirection = (orientation)Enum.Parse(typeof(orientation),myString);
    
    
     }
    }
    
    ответ дан gmail user, с репутацией 1581, 8.01.2014
  • 0 рейтинг

    Ниже приведен хороший полезный класс для Enums

    public static class EnumHelper
    {
        public static int[] ToIntArray(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(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(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;
        }
    }
    
    ответ дан Tawani, с репутацией 6032, 7.09.2010
  • 0 рейтинг

    Для числовых значений это безопаснее, так как будет возвращать объект независимо от того, что:

    public static class EnumEx
    {
        static public bool TryConvert(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;
        }
    }
    
    ответ дан Sébastien Duval, с репутацией 441, 21.02.2013
  • 0 рейтинг

    В качестве альтернативы, используйте метод расширения вместо одной строки:

    public static T ToEnum(this string enumString)
    {
        return (T) Enum.Parse(typeof (T), enumString);
    }
    

    Использование:

    Color colorEnum = "Red".ToEnum();
    

    ИЛИ

    string color = "Red";
    var colorEnum = color.ToEnum();
    
    ответ дан Abdul Munim, с репутацией 15150, 11.11.2011
  • 0 рейтинг

    Немного отошел от исходного вопроса, но я нашел ответ на вопрос переполнения стека Получить значение int из enum полезно. Создайте статический класс со свойствами public const int, что позволит вам легко собрать кучу связанных констант int, а затем не нужно приводить их к int при их использовании.

    public static class Question
    {
        public static readonly int Role = 2;
        public static readonly int ProjectFunding = 3;
        public static readonly int TotalEmployee = 4;
        public static readonly int NumberOfServers = 5;
        public static readonly int TopBusinessConcern = 6;
    }
    

    Очевидно, что некоторые функциональные возможности типа enum будут потеряны, но для хранения нескольких констант идентификаторов базы данных это выглядит довольно аккуратным решением.

    ответ дан Ted, с репутацией 1440, 17.07.2014
  • 0 рейтинг

    В моем случае мне нужно было вернуть enum из службы WCF. Мне также нужно было дружелюбное имя, а не просто enum. Нанизывать().

    Вот мой класс WCF.

    [DataContract]
    public class EnumMember
    {
        [DataMember]
        public string Description { get; set; }
    
        [DataMember]
        public int Value { get; set; }
    
        public static List ConvertToList()
        {
            Type type = typeof(T);
    
            if (!type.IsEnum)
            {
                throw new ArgumentException("T must be of type enumeration.");
            }
    
            var members = new List();
    
            foreach (string item in System.Enum.GetNames(type))
            {
                var enumType = System.Enum.Parse(type, item);
    
                members.Add(
                    new EnumMember() { Description = enumType.GetDescriptionValue(), Value = ((IConvertible)enumType).ToInt32(null) });
            }
    
            return members;
        }
    }
    

    Вот метод Extension, который получает описание из Enum.

        public static string GetDescriptionValue(this T source)
        {
            FieldInfo fileInfo = source.GetType().GetField(source.ToString());
            DescriptionAttribute[] attributes = (DescriptionAttribute[])fileInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);            
    
            if (attributes != null && attributes.Length > 0)
            {
                return attributes[0].Description;
            }
            else
            {
                return source.ToString();
            }
        }
    

    Реализация:

    return EnumMember.ConvertToList();
    
    ответ дан LawMan, с репутацией 2310, 2.07.2014
  • 0 рейтинг

    Я использую этот кусок кода для приведения int к моему enum:

    if (typeof(YourEnum).IsEnumDefined(valueToCast)) return (YourEnum)valueToCast;
    else { //handle it here, if its not defined }
    

    Я считаю это лучшим решением.

    ответ дан MSkuta, с репутацией 745, 21.10.2011
  • 0 рейтинг

    Из строки: (Enum. Parse устарел, используйте Enum. TryParse)

    enum Importance
    {}
    
    Importance importance;
    
    if (Enum.TryParse(value, out importance))
    {
    }
    
    ответ дан Will Yu, с репутацией 396, 21.11.2014
  • 0 рейтинг

    Это безопасный метод преобразования с учетом перечисления:

    public static bool TryConvertToEnum(this int instance, out T result)
      where T: struct
    {
      var enumType = typeof (T);
      if (!enumType.IsEnum)
      {
        throw new ArgumentException("The generic type must be an enum.");
      }
      var success = Enum.IsDefined(enumType, instance);
      if (success)
      {
        result = (T)Enum.ToObject(enumType, instance);
      }
      else
      {
        result = default(T);
      }
      return success;
    }
    
    ответ дан Daniel Fisher lennybacon, с репутацией 1353, 30.03.2015
  • 0 рейтинг

    Иногда у вас есть объект типа MyEnum. Нравится

    var MyEnumType = typeof(MyEnumType);
    

    Тогда:

    Enum.ToObject(typeof(MyEnum), 3)
    
    ответ дан L. D., с репутацией 229, 2.07.2010
  • 0 рейтинг

    Если у вас есть целое число, которое действует как битовая маска и может представлять одно или несколько значений в перечислении [Flags], вы можете использовать этот код для анализа значений отдельных флагов в списке:

    for (var flagIterator = 0x1; flagIterator <= 0x80000000; flagIterator <<= 1)
    {
        // Check to see if the current flag exists in the bit mask
        if ((intValue & flagIterator) != 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), flagIterator))
                ListOfEnumValues.Add((MyEnum)flagIterator);
        }
    }
    
    ответ дан Evan M, с репутацией 1659, 13.04.2011