Как проверить, содержит ли Enum число?

79

У меня есть Enum вроде этого:

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

Я хочу проверить, содержит ли это Enum число, которое я даю. Например: когда я даю 4, Enum содержит это, поэтому я хочу вернуть True, если я даю 7, в этом Enum нет 7, поэтому он возвращает False. Я пробовал Enum.IsDefine, но он проверяет только значение String. Как я могу это сделать?

Джек Чжан
источник
Возможный дубликат Validate Enum Values
голубоватый

Ответы:

180

Для IsDefinedметода требуются два параметра . Первым параметром является тип перечисления для проверки . Этот тип обычно получается с помощью выражения typeof. Второй параметр определяется в качестве основного объекта . Он используется для указания либо целочисленного значения, либо строки, содержащей имя константы, которую нужно найти. Возвращаемое значение - логическое значение, которое истинно, если значение существует, и ложно, если оно не существует.

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
}

ИСТОЧНИК

Джон Ву
источник
8

Попробуй это:

IEnumerable<int> values = Enum.GetValues(typeof(PromotionTypes))
                              .OfType<PromotionTypes>()
                              .Select(s => (int)s);
if(values.Contains(yournumber))
{
      //...
}
хорг
источник
7

Вам следует использовать Enum.IsDefined.

Я пробовал Enum.IsDefine, но он проверяет только значение String.

Я на 100% уверен, что он проверит как строковое значение, так и целое (базовое) значение, по крайней мере, на моей машине.

Ченг Чен
источник
1
Спасибо, это мои ошибки, я забыл преобразовать строку в Int, поэтому Enum.isDefined всегда получает false, когда я даю правильный номер.
Джек Чжан,
Он определенно может принимать (строковое представление с учетом регистра) - см. Документацию или источник для получения дополнительной информации.
Вай Ха Ли
4

Возможно, вы хотите проверить и использовать перечисление строкового значения:

string strType;
if(Enum.TryParse(strType, out MyEnum myEnum))
{
    // use myEnum
}
Hulzi
источник