2011-11-03 20 views
14

VB.NETでは、Option Strictをオンにしても、Enumを整数として渡すことができます。なし(与えられたIntegerが特定のEnumに含まれているかどうかを調べるには?

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

しかし、彼らは、彼らが値を設定することができるように整数としてそれを周りに渡しているが、-1の「いいえ動物」がないように:私の特定の状況で

、誰かがこれに似列挙型を使用していますつまり、列挙型自体で「いいえ動物」)、含まないようになる:後に、彼らは動物のようにそれを求めている、しかし

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

が再び入力します。私の質問は、a) "None"値を含むようにEnumを変更するか、またはb)Enumの各値を[Enum].GetValues(...)を使って循環させることで、与えられたIntegerが列挙型の値にマップするかどうかを簡単に調べることができますか否か?

[Enum] .TryParseなどがあるかもしれないと思っていましたが、そうは見えません。

EDIT:.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を返します。

編集 - ああ、ネットにTryParseがあるようです。

+1

Enum.TryParseは(ある)で.NET 4. – jrummell

+0

あなたのコメントを見て、私は気付いていませんでした。ありがとうございます! – asawyer

2

はおそらく、もっと自分のニーズに合っ4.

Enum.IsDefinedが.NETでEnum.TryParseがあります。

+0

おかげでレイ、私はEnum.TryParseが.NET 4にあったことは知らなかった。残念ながら、プロジェクトは.NET 2にしか存在していないことを忘れていましたが、現在もWindows Server 2000をサポートしていますそこから移動して、私は望みます...)。私はこれを反映するために私の質問を更新しました。 – LordScree

1

1つのオプションは(C#で)このような何かを試してみることです。

bool isTheValueInTheEnum = System.Enum.IsDefined(typeof(Animals), animalType); 
関連する問題