Есть ли способ проверить, является ли int допустимым перечислением в C #?

141
задан DLeh 12 February 2015 в 20:23
поделиться

4 ответа

Проверить Enum.IsDefined

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

if(Enum.IsDefined(typeof(MyEnum), value))
    MyEnum a = (MyEnum)value; 

Это пример с той страницы:

using System;    
[Flags] public enum PetType
{
   None = 0, Dog = 1, Cat = 2, Rodent = 4, Bird = 8, Reptile = 16, Other = 32
};

public class Example
{
   public static void Main()
   {
      object value;     
      // Call IsDefined with underlying integral value of member.
      value = 1;
      Console.WriteLine("{0}: {1}", value, Enum.IsDefined(typeof(PetType), value));
      // Call IsDefined with invalid underlying integral value.
      value = 64;
      Console.WriteLine("{0}: {1}", value, Enum.IsDefined(typeof(PetType), value));
      // Call IsDefined with string containing member name.
      value = "Rodent";
      Console.WriteLine("{0}: {1}", value, Enum.IsDefined(typeof(PetType), value));
      // Call IsDefined with a variable of type PetType.
      value = PetType.Dog;
      Console.WriteLine("{0}: {1}", value, Enum.IsDefined(typeof(PetType), value));
      value = PetType.Dog | PetType.Cat;
      Console.WriteLine("{0}: {1}", value, Enum.IsDefined(typeof(PetType), value));
      // Call IsDefined with uppercase member name.      
      value = "None";
      Console.WriteLine("{0}: {1}", value, Enum.IsDefined(typeof(PetType), value));
      value = "NONE";
      Console.WriteLine("{0}: {1}", value, Enum.IsDefined(typeof(PetType), value));
      // Call IsDefined with combined value
      value = PetType.Dog | PetType.Bird;
      Console.WriteLine("{0:D}: {1}", value, Enum.IsDefined(typeof(PetType), value));
      value = value.ToString();
      Console.WriteLine("{0:D}: {1}", value, Enum.IsDefined(typeof(PetType), value));
   }
}

Пример отображает следующее вывод:

//       1: True
//       64: False
//       Rodent: True
//       Dog: True
//       Dog, Cat: False
//       None: True
//       NONE: False
//       9: False
//       Dog, Bird: False
240
ответ дан 23 November 2019 в 22:42
поделиться

Используйте:

Enum.IsDefined ( typeof ( Enum ), EnumValue );
6
ответ дан 23 November 2019 в 22:42
поделиться

Используйте Enum.IsDefined .

5
ответ дан 23 November 2019 в 22:42
поделиться

Каноническим ответом будет Enum.IsDefined , но это: а: немного медленнее, если используется в узком цикле, и b : бесполезно для перечислений [Flags] .

Лично я бы перестал беспокоиться об этом и просто переключил соответствующим образом, помня:

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

Примерно так:

switch(someflag) {
    case TriBool.Yes:
        DoSomething();
        break;
    case TriBool.No:
        DoSomethingElse();
        break;
    case TriBool.FileNotFound:
        DoSomethingOther();
        break;
    default:
        throw new ArgumentOutOfRangeException("someflag");
}
16
ответ дан 23 November 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: