2012-04-29 30 views
5

我希望確保一個人提供的號碼是合法的HttpStatusCode如何檢查int是否是.NET中的合法HttpStatusCode?

起初我以爲使用Enum.TryParse(..)Enum.Parse(..),但它有可能,我得到一個無效的結果和提供的一些不好的數據..

如。

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. 

好了,如果我通過一個壞AAA值,我得到的System.Argument例外。但是,當我通過數字1(作爲文本,而不是一個整數),我得到的返回值爲1.我會預料到這會失敗並拋出一個異常。

傳遞值爲400 確實返回正確的BadRequest枚舉。

任何想法,鄉親?

回答

9

,而不是試圖簡單地解析值我們IsDefined方法

Enum.IsDefined(typeof(HttpStatusCode),value) 

爲何與「1」的情況下不會失敗的原因是,你可以枚舉做二進制算術。這是使用了很多的標誌,因此價值沒有具體枚舉可能仍然是有效的值

+0

先生/女士,你是紳士/淑女和學者! /我耳語Woot^Woot! – 2012-04-29 07:06:13

-1

你爲什麼不檢查其在該枚舉:

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

爲什麼不將所有這些十六進制數轉換爲小數?它只是看起來像一個故意混淆.. – Funbit 2013-02-27 03:24:24

+0

@funbit我沒有做到這一點。這是從反射器 – 2016-10-12 06:34:53

+0

即使4年後很好知道,謝謝:) – Funbit 2016-10-13 13:22:37

5

documented behaviour

如果是不對應於給定恆定enumType的名稱,該方法將引發ArgumentException。如果是不表示枚舉的基礎值的整數的字符串表示形式,則該方法返回一個枚舉成員,其基礎值爲轉換爲整數類型。如果此行爲不受歡迎,請調用IsDefined方法以確保整數的特定字符串表示形式實際上是enumType的成員。

+0

好的發現。我在lightspeed上瀏覽過文檔,錯過了這個非常重要的段落。發現得好! – 2012-04-29 07:07:49

相關問題