Как определить, находится ли данное Integer в определенном Enum? - PullRequest
16 голосов
/ 03 ноября 2011

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

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

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

Но они передают его как целое число, поэтому они могут установить значение -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

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

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

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

Ответы [ 4 ]

36 голосов
/ 03 ноября 2011

Хотя в .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
}
3 голосов
/ 03 ноября 2011

Существует Enum.TryParse в .NET 4.

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

3 голосов
/ 03 ноября 2011

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

bool isTheValueInTheEnum = System.Enum.IsDefined(typeof(Animals), animalType);
0 голосов
/ 03 ноября 2011

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

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

.

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

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

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

Редактировать - О, похоже, в .Net 4 есть TryParse. Это здорово!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...