2011-11-03 35 views
14

VB.NET'te, Option Strict ile bile, Enum'u bir Tamsayı olarak geçirebilirsiniz. olmadan (Belirli bir Tamsayı'nın belirli bir Enum içinde nasıl belirlenir?

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

Fakat bir değer ayarlayabilirsiniz böylece bir tamsayı olarak etrafında geçiyoruz -1 "hiçbir hayvan" olarak: benim özel durumda

, birisi buna benzer bir enum kullanıyor Enum kendisi), yani içinde "Hayır hayvanı" dahil etmek zorunda: bir Hayvanlar tekrar yazmanız olmak için

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

Ancak daha sonra, onlar soruyorsun. Benim sorumum, Enum'u "Yok" değerini içerecek şekilde değiştirmenin veya b) Enum'daki [Enum].GetValues(...)'u kullanarak her bir değerde dolaşmayı değiştirmenin yanı sıra, belirli bir Tamsayı'nın enum'daki bir değerin eşleşip eşleşmediğini anlamak için kolay bir yoldur. ya da değil?

Bir [Numaralandırma] .TryParse falan olabilir orada umuyordum, ama var gibi görünmüyor.

DÜZENLEME: Bazılarınızın önerdiği gibi, .NET 4. Enum.TryParse var. Ne yazık ki, söz konusu projenin hala Windows Server 2000'i desteklemesi gerekir, bu yüzden en son .NET Framework'ü kullanamıyoruz (umarız Yakında Windows Server 2000 desteğini bırakabileceğiz ..!).

+0

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

cevap

27

Bu özel senaryo için kullanmak gerektiğini Enum.TryParse yöntemi tanıtıldı .NET 4.0 rağmen. .NET bir numaralandırma herhangi biri olabilir, altta yatan türü, aşağıdaki (byte, sbyte, short, ushort, int, uint, long veya ulong). Varsayılan olarak int, dolayısıyla geçerli bir int olan herhangi bir değer de geçerli bir numaralandırma değeridir.

Bu, Enum.TryParse<Animal>("-1", out result) raporunun, -1 belirtilen herhangi bir numaralandırma numarasına bağlı olmamasına rağmen başarılı olduğu anlamına gelir.

Diğerleri de belirttiğimiz gibi, bu senaryolar için Enum.IsDefined yöntemini kullanmanız gerekir.(C#)

örnek kod: in Enum.TryParse()

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

Teşekkürler @ JoãoAngelo. Bir çekicilik çalışır – LordScree

-1

[Enum].TryParse yoktur, ancak [Enum].Parse öğesinin başarılı olması gerektiği anlamına gelirse [Enum].IsDefined vardır.

Ayrıca ben gibi bir desen kullanma eğiliminde benim çeteleler yılında Enum

bir None = -1 seçeneği eklemek gerekir:

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

Yani bu bir varsayılan int -> Numaralandırma Unknown dönecektir

Düzen - düzgün var .Net 4'te bir TryParse var Oh, görünüşe göre!

+1

yoktur NET 4. – jrummell

+0

Sadece yorumunu gördüm, habersizdim. Teşekkürler bayım! – asawyer

2

muhtemelen daha iyi uygun gerekiyor 4.

Enum.IsDefined rağmen NET'te bir Enum.TryParse yoktur.

+0

Teşekkürler Ray, .NET 4. Enum.TryParse olduğunu bilmiyordum. Ne yazık ki, hala Windows Server 2000'i desteklediğinden, projenin yalnızca .NET 2'de olduğunu söylemeyi unutmuşum. bundan devam et, umarım ...). Sorumu, bunu yansıtmak için güncelledim. – LordScree

1

Seçeneklerden biri (C#) böyle bir şey çalışmaktır:

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