Reputation: 3081
In VB.NET, even with Option Strict
on, it's possible to pass an Enum around as an Integer.
In my particular situation, someone's using an enum similar to this:
Public Enum Animals
Monkey = 1
Giraffe = 2
Leopard = 3
Elephant = 4
End Enum
But they are passing it around as an Integer so they can set a value of -1 to be "No animal" (without having to include "No animal" in the Enum itself), i.e.:
Public Sub MakeAnimalJump(animalType As Int32)
If animalType < 1 Then
' Clearly not an animal...
Else
' Make that animal jump...
End If
End Sub
However, later on, they're asking for it to be an Animals type again. My question is, aside from a) changing the Enum to include a "None" value or b) cycling through each value in the Enum using [Enum].GetValues(...)
, is there an easy way to work out whether a given Integer maps to a value in the enum or not?
I was hoping there might be an [Enum].TryParse or something, but it doesn't look like there is.
EDIT: As some of you have suggested, there is an Enum.TryParse in .NET 4. Unfortunately, the project in question must still support Windows Server 2000, so we can't use the latest .NET Framework (hopefully we'll be able to drop support for Windows Server 2000 soon..!).
Upvotes: 27
Views: 22632
Reputation: 17808
There is [Enum].IsDefined
which if try means your [Enum].Parse
should succeed.
You should also be able to add a None = -1
option to the Enum
In my enums I tend to use a pattern like:
public enum Items
{
Unknown = 0,
One,
Two,
Three,
}
So that a default int -> Enum will return Unknown
In .NET 4 there is a TryParse
method too.
Upvotes: 0
Reputation: 57658
Although .NET 4.0 introduced the Enum.TryParse
method you should not use it for this specific scenario. In .NET an enumeration has an underlying type which can be any of the following (byte
, sbyte
, short
, ushort
, int
, uint
, long
, or ulong
). By default is int
, so any value that is a valid int
is also a valid enumeration value.
This means that Enum.TryParse<Animal>("-1", out result)
reports success even though -1
is not associated to any specified enumeration value.
As other have noted, for this scenarios, you must use Enum.IsDefined
method.
Sample code (in 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
}
Upvotes: 61
Reputation: 27608
One option is to try something like this (in C#):
bool isTheValueInTheEnum = System.Enum.IsDefined(typeof(Animals), animalType);
Upvotes: 9
Reputation: 46555
There is an Enum.TryParse in .NET 4.
Although Enum.IsDefined probably suits your needs better.
Upvotes: 3