2012-04-29 9 views
5

Deseo asegurarme de que el número que proporciona una persona sea legítimo HttpStatusCode.¿Cómo puedo verificar si un int es un HttpStatusCode legítimo en .NET?

Al principio pensó en utilizar Enum.TryParse(..) o Enum.Parse(..) pero es posible consigo un resultado no válido con algunos malos datos proporcionados ..

por ejemplo.

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, así que si paso en una mala relación calidad-aaa , consigo la excepción System.Argument. Pero cuando paso el número 1 (como texto, no como int) obtengo el valor de retorno de 1. Hubiera esperado que fallara y emitiera una excepción.

Al pasar un valor de 400 hace devolver la enumeración correcta BadRequest.

¿Alguna idea, amigos?

Respuesta

9

lugar de tratar de analizar el valor simplemente nos el método IsDefined

Enum.IsDefined(typeof(HttpStatusCode),value) 

La razón por la cual el caso de "1" no falla es que se puede hacer aritmética binaria en las enumeraciones. Esto se utiliza una gran cantidad de banderas, por tanto, los valores no específicamente en la enumeración aún podrían ser valores válidos

+0

Sir/señora, usted es un caballero/una dama y un erudito!/Me susurra Woot^Woot! –

-1

¿por qué no se comprueba si es en esta enumeración:

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

¿Por qué no convertir todos estos números hexadecimales en decimales? Simplemente parece una ofuscación deliberada. – Funbit

+0

@funbit no lo hice. Es de reflector –

+0

Incluso después de 4 años es bueno saberlo, gracias :) – Funbit

5

Eso es la documented behaviour:

Si valor es un nombre que no corresponde a una constante con nombre de enumType, el método produce una ArgumentException. Si valor es la representación de cadena de un entero que no representa un valor subyacente de la enumeración enumType enumType, el método devuelve un miembro de enumeración cuyo valor subyacente es valor convertido a un tipo integral. Si este comportamiento no es deseable, llame al método IsDefined para asegurarse de que una representación de cadena particular de un entero sea realmente un miembro de enumType.

+0

Bien encontrado. Revisé los documentos a la velocidad de la luz y me perdí este * muy * importante párrafo. ¡Bien descrito! –

Cuestiones relacionadas