2011-11-03 58 views
14

在VB.NET中,即使使用Option Strict,也可以將Enum作爲整數傳遞。如何確定給定的Integer是否在特定的Enum中?

在我的特殊情況下,有人在使用類似這樣的枚舉:-1

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

但它們都是圍繞把它當作一個整數,使他們能夠設置一個值是「沒有動物」(不有包括「沒有動物」在枚舉本身),即:

Public Sub MakeAnimalJump(animalType As Int32) 
    If animalType < 1 Then 
     ' Clearly not an animal... 
    Else 
     ' Make that animal jump... 
    End If 
End Sub 

但是,後來,他們要求它是一種動物再次輸入。我的問題是,除了a)改變Enum以包含「None」值或b)使用[Enum].GetValues(...)循環訪問Enum中的每個值,有沒有一種簡單的方法可以計算給定的Integer是否映射到enum中的值或不?

我希望可能有一個[Enum] .TryParse或其他東西,但它看起來並不像。

編輯:正如你們中的一些人所建議的,.NET 4中有一個Enum.TryParse。不幸的是,有問題的項目仍然必須支持Windows Server 2000,所以我們不能使用最新的.NET Framework(希望我們將很快放棄對Windows Server 2000的支持..!)。

+0

Enum.TryParse()http://msdn.microsoft.com/en-us/library/ee835389.aspx – jrummell

回答

27

雖然.NET 4.0中引入的,你不應該使用它的這種特定情況下的Enum.TryParse方法。在.NET枚舉具有一個基本類型,其可以是任何的下述(bytesbyteshortushortintuintlong,或ulong)。默認爲int,所以任何有效的值int也是一個有效的枚舉值。

這意味着即使-1未與任何指定的枚舉值關聯,Enum.TryParse<Animal>("-1", out result)也會報告成功。

正如其他人所指出的,對於這種情況下,您必須使用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

謝謝@JoãoAngelo。發揮魅力 – LordScree

-1

有沒有[Enum].TryParse,但有[Enum].IsDefined如果嘗試意味着你的[Enum].Parse應該成功。

你也應該能夠爲None = -1選項添加到枚舉

在我枚舉我傾向於使用類似的模式:

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

這樣一個默認INT - >枚舉將返回Unknown

編輯 - 哦,看起來像在.net 4中有一個TryParse。這很整潔!

+1

有Enum.TryParse()中.NET 4. – jrummell

+0

剛剛看到您的評論,我不知道。謝謝你,先生! – asawyer

2

有一個在.NET 4

雖然Enum.IsDefined可能適合您的需要更好的Enum.TryParse

+0

感謝Ray,我不知道.NET 4中有一個Enum.TryParse。不幸的是,我忘了提及該項目目前僅在.NET 2中,因爲它仍然支持Windows Server 2000(最終,我們將繼續前進,我希望...)。我已更新我的問題以反映這一點。 – LordScree

1

一種選擇是嘗試這樣的事情(在C#):

bool isTheValueInTheEnum = System.Enum.IsDefined(typeof(Animals), animalType); 
相關問題