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

В VB.NET, даже с Option Strict on, можно передать Enum вокруг как целое.

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

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

Но они передают его как Integer, поэтому они могут установить значение -1 как "Без животных" (без необходимости включать "Без животных" в само Enum), то есть:

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 на включение значения "None" или b) циклическое перемещение через каждое значение в Enum с помощью [Enum].GetValues(...), есть ли простой способ определить, соответствует ли данное целое числу значению в перечисление или нет?

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

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

Ответы

Ответ 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.

Пример кода (в С#):

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
}

Ответ 2

В .NET 4 есть Enum.TryParse.

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

Ответ 3

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

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

Ответ 4

Нет [Enum].TryParse, но есть [Enum].IsDefined, который, если try, означает, что ваш [Enum].Parse должен преуспеть.

Вы также можете добавить опцию None = -1 в Enum

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

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

Итак, чтобы по умолчанию int → Enum вернет Unknown

Изменить - О, похоже, что есть TryParse в .Net 4. Это аккуратно!