#.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.