2012-04-29 27 views
5

Tôi muốn đảm bảo rằng số người cung cấp, là HttpStatusCode hợp pháp.Làm thế nào tôi có thể kiểm tra xem một int là một HttpStatusCode legit trong .NET?

Lúc đầu, tôi nghĩ đến việc sử dụng Enum.TryParse(..) hoặc Enum.Parse(..) nhưng nó có thể tôi nhận được một kết quả không hợp lệ với một số dữ liệu xấu cung cấp ..

ví dụ.

In: Enum.Parse(typeof (HttpStatusCode), "1") 
Out: 1 

In: Enum.Parse(typeof (HttpStatusCode), "400") 
Out: BadRequest 

In: Enum.Parse(typeof (HttpStatusCode), "aaa") 
Out: System.ArgumentException: Requested value 'aaa' was not found. 

Ok, vì vậy nếu tôi vượt qua trong một giá trị aaa xấu, tôi nhận được ngoại lệ System.Argument. Nhưng khi tôi vượt qua trong một số 1 (như văn bản, không phải là một int) tôi nhận được giá trị trả về 1. Tôi đã có thể mong đợi điều này để thất bại và ném một ngoại lệ.

Truyền giá trị 400 không trả về đúng BadRequest điều tra.

Mọi ý tưởng, mọi người?

Trả lời

9

Thay vì cố gắng phân tích giá trị chỉ đơn giản là chúng ta những phương pháp IsDefined

Enum.IsDefined(typeof(HttpStatusCode),value) 

Lý do tại sao xảy ra với "1" không thất bại là bạn có thể làm số học nhị phân trên enumerations. Này được sử dụng rất nhiều cho cờ, do đó giá trị không rõ ràng trong enum vẫn có thể là giá trị hợp lệ

+0

Thưa quý bà, bạn là một quý ông/quý ông và một học giả!/tôi thì thầm Woot^Woot! –

-1

tại sao không bạn kiểm tra xem nó trong enum này:

public enum HttpStatusCode 
{ 
    Accepted = 0xca, 
    Ambiguous = 300, 
    BadGateway = 0x1f6, 
    BadRequest = 400, 
    Conflict = 0x199, 
    Continue = 100, 
    Created = 0xc9, 
    ExpectationFailed = 0x1a1, 
    Forbidden = 0x193, 
    Found = 0x12e, 
    GatewayTimeout = 0x1f8, 
    Gone = 410, 
    HttpVersionNotSupported = 0x1f9, 
    InternalServerError = 500, 
    LengthRequired = 0x19b, 
    MethodNotAllowed = 0x195, 
    Moved = 0x12d, 
    MovedPermanently = 0x12d, 
    MultipleChoices = 300, 
    NoContent = 0xcc, 
    NonAuthoritativeInformation = 0xcb, 
    NotAcceptable = 0x196, 
    NotFound = 0x194, 
    NotImplemented = 0x1f5, 
    NotModified = 0x130, 
    OK = 200, 
    PartialContent = 0xce, 
    PaymentRequired = 0x192, 
    PreconditionFailed = 0x19c, 
    ProxyAuthenticationRequired = 0x197, 
    Redirect = 0x12e, 
    RedirectKeepVerb = 0x133, 
    RedirectMethod = 0x12f, 
    RequestedRangeNotSatisfiable = 0x1a0, 
    RequestEntityTooLarge = 0x19d, 
    RequestTimeout = 0x198, 
    RequestUriTooLong = 0x19e, 
    ResetContent = 0xcd, 
    SeeOther = 0x12f, 
    ServiceUnavailable = 0x1f7, 
    SwitchingProtocols = 0x65, 
    TemporaryRedirect = 0x133, 
    Unauthorized = 0x191, 
    UnsupportedMediaType = 0x19f, 
    Unused = 0x132, 
    UseProxy = 0x131 
} 



var exists= Enum.IsDefined(typeof(HttpStatusCode),myEnumValue) 
+6

Tại sao không chuyển đổi tất cả các số thập lục phân sang số thập phân? Nó trông giống như một obfuscation cố ý .. – Funbit

+0

@funbit tôi didnt làm điều đó. Đó là từ phản xạ –

+0

Thậm chí sau 4 năm tốt để biết điều đó, cảm ơn :) – Funbit

5

Đó các documented behaviour:

Nếu giá trị là tên không tương ứng với hằng số được đặt tên là enumType, phương thức sẽ ném ArgumentException. Nếu giá trị là biểu diễn chuỗi của số nguyên không đại diện cho giá trị cơ bản của điều kiện enumType, phương thức trả về thành viên liệt kê có giá trị cơ bản là giá trị được chuyển đổi thành loại không thể tách rời. Nếu hành vi này là không mong muốn, hãy gọi phương thức IsDefined để đảm bảo rằng biểu diễn chuỗi cụ thể của một số nguyên thực sự là thành viên của enumType.

+0

Cũng được tìm thấy. Tôi đã lướt qua các tài liệu ở tốc độ đèn và bỏ qua đoạn * rất quan trọng này. Vâng phát hiện! –

Các vấn đề liên quan