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

时间:2011-11-03 13:54:32

标签: .net enums

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

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

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

但是他们将它作为一个整数传递,所以他们可以将-1的值设置为“无动物”(不需要在Enum本身中包含“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

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

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

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

4 个答案:

答案 0 :(得分:36)

尽管.NET 4.0引入了Enum.TryParse方法,但您不应将其用于此特定方案。在.NET中,枚举具有基础类型,可以是以下任何一种(bytesbyteshortushortint,{{1 },uintlong)。默认情况下为ulong,因此任何有效int的值也都是有效的枚举值。

这意味着int报告成功,即使Enum.TryParse<Animal>("-1", out result)未与任何指定的枚举值相关联。

正如其他人所说,对于这种情况,您必须使用-1方法。

示例代码(在C#中):

Enum.IsDefined

答案 1 :(得分:3)

.NET 4中有Enum.TryParse

虽然Enum.IsDefined可能更适合您的需求。

答案 2 :(得分:3)

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

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

答案 3 :(得分:-1)

没有[Enum].TryParse,但有[Enum].IsDefined如果尝试意味着您的[Enum].Parse应该成功。

您还应该能够在枚举

中添加None = -1选项

在我的枚举中,我倾向于使用如下模式:

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

这样一个默认的int - &gt;枚举将返回Unknown

编辑 - 哦,看起来.Net 4中有一个TryParse。那很整洁!