¿Cómo comprobar si una enumeración contiene un número?

79

Tengo un Enum como este:

 public enum PromotionTypes
{
    Unspecified = 0, 
    InternalEvent = 1,
    ExternalEvent = 2,
    GeneralMailing = 3,  
    VisitBased = 4,
    PlayerIntroduction = 5,
    Hospitality = 6
}

Quiero comprobar si este Enum contiene un número que doy. Por ejemplo: cuando doy 4, Enum contiene eso, así que quiero devolver True, si doy 7, no hay 7 en esta Enum, por lo que devuelve False. Probé Enum.IsDefine pero solo verifica el valor de String. ¿Cómo puedo hacer eso?

Jack Zhang
fuente
Posible duplicado de Validate Enum Values
azulado

Respuestas:

180

El IsDefinedmétodo requiere dos parámetros . El primer parámetro es el tipo de enumeración que se debe verificar . Este tipo se suele obtener mediante una expresión de tipo. El segundo parámetro se define como un objeto básico . Se utiliza para especificar el valor entero o una cadena que contiene el nombre de la constante a buscar. El valor de retorno es un booleano que es verdadero si el valor existe y falso si no.

enum Status
{
    OK = 0,
    Warning = 64,
    Error = 256
}

static void Main(string[] args)
{
    bool exists;

    // Testing for Integer Values
    exists = Enum.IsDefined(typeof(Status), 0);     // exists = true
    exists = Enum.IsDefined(typeof(Status), 1);     // exists = false

    // Testing for Constant Names
    exists = Enum.IsDefined(typeof(Status), "OK");      // exists = true
    exists = Enum.IsDefined(typeof(Status), "NotOK");   // exists = false
}

FUENTE

John Woo
fuente
8

Prueba esto:

IEnumerable<int> values = Enum.GetValues(typeof(PromotionTypes))
                              .OfType<PromotionTypes>()
                              .Select(s => (int)s);
if(values.Contains(yournumber))
{
      //...
}
horgh
fuente
7

Deberías usar Enum.IsDefined.

Probé Enum.IsDefine pero solo verifica el valor de String.

Estoy 100% seguro de que verificará tanto el valor de la cadena como el valor int (el subyacente), al menos en mi máquina.

Cheng Chen
fuente
1
Gracias, son mis errores, olvidé convertir la cadena a Int, por lo que Enum.isDefined siempre se vuelve falso cuando di el número correcto.
Jack Zhang
Definitivamente puede tomar la (representación de cadena que distingue entre mayúsculas y minúsculas); consulte los documentos o la fuente para obtener más información.
Wai Ha Lee
4

Tal vez desee verificar y usar la enumeración del valor de la cadena:

string strType;
if(Enum.TryParse(strType, out MyEnum myEnum))
{
    // use myEnum
}
Hulzi
fuente