如何确定给定的Integer是否在特定的枚举中?

oli*_*are 19 .net enums

在VB.NET中,即使使用Option Stricton,也可以将Enum作为整数传递.

在我的特殊情况下,有人使用与此类似的枚举:

Public Enum Animals
    Monkey = 1
    Giraffe = 2
    Leopard = 3
    Elephant = 4
End Enum
Run Code Online (Sandbox Code Playgroud)

但是他们将它作为整数传递,因此他们可以将-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
Run Code Online (Sandbox Code Playgroud)

然而,在稍后,他们再次要求它成为动物类型.我的问题是,除了a)更改枚举以包含"无"值或b)循环使用枚举中的每个值[Enum].GetValues(...),是否有一种简单的方法可以确定给定的整数是否映射到枚举中的值或不?

我希望可能有[Enum] .TryParse或其他东西,但它看起来不像.

编辑:正如你们有人建议的那样,.NET 4中有一个Enum.TryParse.不幸的是,有问题的项目仍然必须支持Windows Server 2000,所以我们不能使用最新的.NET Framework(希望我们会成为能够尽快放弃对Windows Server 2000的支持..!).

Joã*_*elo 41

尽管.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
}
Run Code Online (Sandbox Code Playgroud)


wag*_*ghe 7

一种选择是尝试这样的操作(在 C# 中):

bool isTheValueInTheEnum = System.Enum.IsDefined(typeof(Animals), animalType);
Run Code Online (Sandbox Code Playgroud)