2010-04-09 3 views
18

Я хочу проверить, что некоторый целочисленный тип принадлежит элементу перечисления (an).Убедитесь, что целочисленный тип принадлежит элементу перечисления

Для примера,

public enum Enum1 
{ 
    member1 = 4, 

    member2 = 5, 

    member3 = 9, 

    member4 = 0 
} 

enum1 e1 = (enum1) 4 дает мне member1

enum1 e2 = (enum1) 10 не дает мне ничего, и я хочу, чтобы проверить его.

+0

Не знаю, как использовать перемычку в любом случае. Попробуйте, если вы можете использовать словарь вместо – Amsakanna

+0

Что вы хотите проверить ...? – Ravia

+0

Возможный дубликат [Validate Enum Values] (http://stackoverflow.com/questions/13615/validate-enum-values) – bluish

ответ

45

Использование Enum.IsDefined

Enum.IsDefined(typeof(Enum1), 4) == true 

но

Enum.IsDefined(typeof(Enum1), 1) == false 
+4

Не используйте это, если вам нужна скорость: Enum.IsDefined использует Reflection и является ** very * * медленный. – ereOn

+6

Во-первых, микро-оптимизация - это трата усилий по программированию. Во-вторых, 'Enum.IsDefined' будет работать более 2000 раз за миллисекунду. Я бы не стал считать это медленным. –

+0

ereOn, Как я могу сделать это быстрее? –

1

Вы просматриваете значения перечисления и сравниваете их с целым числом.

static bool EnumTest(int testVal, Enum e) 
    { 
     bool result = false; 
     foreach (var val in Enum.GetValues(typeof(Enum1))) 
     { 
      if ((int)val == testVal) 
      { 
       result = true; 
       break; 
      } 
     } 
     return result; 
    } 

Редактировать: Похоже, Сэм имеет better solution.

3

Как говорит Сэм, вы можете использовать IsDefined. Это несколько неудобно. Вы можете хотите посмотреть на моей Unconstrained Melody библиотеки, которая позволила бы вам нас:

Enum1 e2 = (Enum1)10; 
if (e2.IsNamedValue()) // Will return false 
{ 
} 

Это, вероятно, не стоит для одного вызова перечислений, но если вы делаете много вещей с перечислениями вы можете найти некоторые полезные вещи там.

Это должно быть быстрее, чем Enum.IsDefined. Он только делает линейное сканирование в данный момент, но дайте мне знать, если вам нужно, чтобы это улучшилось :) (Большинство перечислений достаточно малы, что, вероятно, они не выиграют от HashSet, но мы могли бы выполнить двоичный поиск ...)

0
int testNum = 5; 
bool isMember = Enum.GetValues(typeof(Enum1)).Cast<int>().Any(x => x == testNum); 
Смежные вопросы