2010-04-09 15 views
18

Quiero comprobar que algún tipo entero pertenece a (un) miembro de enumeración.Compruebe que el tipo entero pertenece al miembro enum

por ejemplo,

public enum Enum1 
{ 
    member1 = 4, 

    member2 = 5, 

    member3 = 9, 

    member4 = 0 
} 

Enum1 e1 = (Enum1) 4 me da miembro1

Enum1 e2 = (Enum1) 10 Me da nada y quiero comprobarlo.

+0

No sé cuál es su propósito de utilizar un enum de todos modos. Intente si puede usar un diccionario en su lugar – Amsakanna

+0

¿Qué desea verificar ...? – Ravia

+0

Posible duplicado de [Validate Enum Values] (http://stackoverflow.com/questions/13615/validate-enum-values) – bluish

Respuesta

45

Uso Enum.IsDefined

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

pero

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

No use esto si necesita velocidad: Enum.IsDefined usa Reflection y es ** muy * * lento. – ereOn

+6

Primero, la micro-optimización es un desperdicio del esfuerzo de programación. En segundo lugar, 'Enum.IsDefined' se ejecutará más de 2.000 veces por milisegundo. No lo consideraría tan lento. –

+0

ereOn, ¿cómo puedo hacerlo más rápido? –

1

Miras los valores de la enumeración y los comparas con el número entero.

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; 
    } 

Editar: Parece que Sam tiene una better solution.

3

Como dice Sam, puede usar IsDefined. Sin embargo, esto es algo incómodo. Usted puede desee mirar a mi biblioteca Unconstrained Melody que nos dejaron:

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

Es probable que no vale la pena para una sola llamada de enumeración, pero si usted está haciendo un montón de cosas con las enumeraciones se puede encontrar algunas cosas útiles allí.

Debe ser más rápido que Enum.IsDefined por cierto. Solo hace un escaneo lineal en este momento, pero avíseme si necesita que se mejore :) (La mayoría de las enumeraciones son lo suficientemente pequeñas como para que probablemente no se beneficien de un HashSet, pero podríamos hacer una búsqueda binaria ...)

0
int testNum = 5; 
bool isMember = Enum.GetValues(typeof(Enum1)).Cast<int>().Any(x => x == testNum); 
Cuestiones relacionadas