Как определить, находится ли данное целое число в определенном перечислении?

#.net #enums

#.net #перечисления

Вопрос:

В VB.NET , даже при Option Strict включении, можно передавать перечисление как целое число.

В моей конкретной ситуации кто-то использует перечисление, подобное этому:

 Public Enum Animals
    Monkey = 1
    Giraffe = 2
    Leopard = 3
    Elephant = 4
End Enum
  

Но они передают его как целое число, чтобы они могли установить значение -1 как «No animal» (без необходимости включать «No animal» в само перечисление), т.е.:

 Public Sub MakeAnimalJump(animalType As Int32)
    If animalType < 1 Then
        ' Clearly not an animal...
    Else
        ' Make that animal jump...
    End If
End Sub
  

Однако позже они снова просят, чтобы это был тип Animals . Мой вопрос заключается в том, что, помимо а) изменения перечисления для включения значения «Нет» или б) циклического перебора каждого значения в перечислении [Enum].GetValues(...) , есть ли простой способ определить, соответствует ли данное целое значение значению в перечислении или нет?

Я надеялся, что может быть [Enum] .Попробуйте проанализировать или что-то в этом роде, но, похоже, это не так.

РЕДАКТИРОВАТЬ: как некоторые из вас предположили, существует перечисление.Попробуйте проанализировать в .NET 4. К сожалению, рассматриваемый проект все еще должен поддерживать Windows Server 2000, поэтому мы не можем использовать последнюю версию .NET Framework (надеюсь, мы скоро сможем отказаться от поддержки Windows Server 2000 ..!).

Комментарии:

1. Перечисление. TryParse() msdn.microsoft.com/en-us/library/ee835389.aspx

Ответ №1:

Хотя .NET 4.0 представил Enum.TryParse метод, вы не должны использовать его для этого конкретного сценария. В .NET перечисление имеет базовый тип, который может быть любым из следующих ( byte , sbyte , short , ushort , int , uint , long , или ulong ). По умолчанию равно int , поэтому любое допустимое значение int также является допустимым значением перечисления.

Это означает, что Enum.TryParse<Animal>("-1", out result) сообщает об успешном завершении, даже если -1 оно не связано с каким-либо указанным значением перечисления.

Как отмечали другие, для этих сценариев вы должны использовать Enum.IsDefined метод.

Пример кода (на C #):

 enum Test { Zero, One, Two }

static void Main(string[] args)
{
    Test value;
    bool tryParseResult = Enum.TryParse<Test>("-1", out value);
    bool isDefinedResult = Enum.IsDefined(typeof(Test), -1);

    Console.WriteLine("TryParse: {0}", tryParseResult); // True
    Console.WriteLine("IsDefined: {0}", isDefinedResult); // False
}
  

Комментарии:

1. Похоже, что IsDefined не работает, если значение является фактической строкой. Например. «Один». IsDefined возвращает false

Ответ №2:

Один из вариантов — попробовать что-то вроде этого (на C #):

 bool isTheValueInTheEnum = System.Enum.IsDefined(typeof(Animals), animalType);
  

Ответ №3:

Существует перечисление.Попробуйте проанализировать в .NET 4.

Хотя перечисление.IsDefined, вероятно, лучше соответствует вашим потребностям.

Комментарии:

1. Спасибо, Рэй, я понятия не имел, что есть перечисление. Попробуйте проанализировать в .NET 4. К сожалению, я забыл упомянуть, что в настоящее время проект находится только в .NET 2, поскольку он по-прежнему поддерживает Windows Server 2000 (в конце концов, мы перейдем от этого, я надеюсь …). Я обновил свой вопрос, чтобы отразить это.

Ответ №4:

Существует [Enum].IsDefined , если попытка означает, что вы [Enum].Parse должны добиться успеха.

Вы также должны иметь возможность добавлять None = -1 опцию в перечисление

В своих перечислениях я обычно использую шаблон типа:

 public enum Items
{
    Unknown = 0,
    One,
    Two, 
    Three,
}
  

Так что по умолчанию int -> Enum вернет Unknown


В .NET 4 тоже есть TryParse метод.

Комментарии:

1. Существует перечисление. Попробуйте выполнить синтаксический анализ () в .NET 4.