2011-11-03 42 views
14

Trong VB.NET, ngay cả với Option Strict trên, nó có thể vượt qua một Enum xung quanh như là một số nguyên.Làm thế nào để xác định nếu một số nguyên nhất định là trong một Enum cụ thể?

Trong tình huống cụ thể của tôi, ai đó đang sử dụng một enum tương tự như sau:

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

Nhưng họ đang đi qua nó chạy lòng vòng như Integer để họ có thể thiết lập giá trị là -1 là "Không có động vật" (không có phải bao gồm "Không có động vật" trong chính Enum), nghĩa là:

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

Tuy nhiên, sau này, chúng yêu cầu nó trở thành loại động vật một lần nữa. Câu hỏi của tôi là, ngoài a) thay đổi Enum để bao gồm giá trị "None" hoặc b) đi qua từng giá trị trong Enum bằng cách sử dụng [Enum].GetValues(...), có cách dễ dàng để tìm ra liệu một Integer đã ánh xạ tới một giá trị trong enum hay không hay không?

Tôi đã hy vọng có thể có một [Enum] .TryParse hoặc một cái gì đó, nhưng nó không giống như có.

EDIT: Như một số bạn đã đề xuất, có một Enum.TryParse trong .NET 4. Thật không may, dự án được đề cập vẫn phải hỗ trợ Windows Server 2000, vì vậy chúng tôi không thể sử dụng Khuôn khổ .NET mới nhất (hy vọng chúng tôi sẽ sớm có thể thả hỗ trợ cho Windows Server 2000!).

+0

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

Trả lời

27

Mặc dù .NET 4.0 đã giới thiệu phương pháp Enum.TryParse bạn không nên sử dụng nó cho kịch bản cụ thể này. Trong .NET, một kiểu liệt kê có một kiểu cơ bản có thể là bất kỳ loại nào sau đây (byte, sbyte, short, ushort, int, uint, long hoặc ulong). Theo mặc định là int, vì vậy, bất kỳ giá trị nào hợp lệ int cũng là giá trị điều tra hợp lệ.

Điều này có nghĩa là Enum.TryParse<Animal>("-1", out result) báo cáo thành công mặc dù -1 không được liên kết với bất kỳ giá trị điều tra được chỉ định nào.

Như đã lưu ý, trong trường hợp này, bạn phải sử dụng phương thức Enum.IsDefined.

Mẫu mã (trong 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

Cảm ơn @ JoãoAngelo. Làm việc quyến rũ – LordScree

-1

Không có [Enum].TryParse, nhưng có [Enum].IsDefined nếu thử có nghĩa là [Enum].Parse của bạn sẽ thành công.

Bạn cũng sẽ có thể để thêm một lựa chọn None = -1 đến Enum

Trong enums của tôi, tôi có xu hướng sử dụng một mô hình như:

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

Vì vậy mà một int mặc định -> Enum sẽ trở lại Unknown

Chỉnh sửa - Ồ, có vẻ như có một TryParse trong .Net 4. Đó là gọn gàng!

+1

Có Enum.TryParse() trong .NET 4. – jrummell

+0

Chỉ nhìn thấy bình luận của bạn, tôi không biết. Cảm ơn ngài! – asawyer

2

Có một Enum.TryParse trong .NET 4.

Mặc dù Enum.IsDefined lẽ phù hợp với nhu cầu của bạn tốt hơn.

+0

Cảm ơn Ray, tôi không biết có một Enum.TryParse trong .NET 4. Thật không may, tôi quên đề cập đến dự án này là .NET 2 hiện tại, vì nó vẫn hỗ trợ Windows Server 2000 (cuối cùng, chúng tôi sẽ di chuyển từ đó, tôi hy vọng ...). Tôi đã cập nhật câu hỏi của mình để phản ánh điều này. – LordScree

1

Một lựa chọn là để thử một cái gì đó như thế này (trong C#):

bool isTheValueInTheEnum = System.Enum.IsDefined(typeof(Animals), animalType); 
Các vấn đề liên quan