2011-11-02 12 views
6

he declarado lo siguiente enumeración:Obtener el nombre de enumeración basada en el valor de enumeración

public enum AfpRecordId 
{ 
    BRG = 0xD3A8C6, 
    ERG = 0xD3A9C6 
} 

y quiero recuperar el objeto de enumeración de es valor:

private AfpRecordId GetAfpRecordId(byte[] data) 
{ 
    ...      
} 

Ejemplos de llamadas:

byte[] tempData = new byte { 0xD3, 0xA8, 0xC6 }; 
AfpRecordId tempId = GetAfpRecordId(tempData); 

//tempId should be equals to AfpRecordId.BRG 

También me gustaría usar linq o lambda, solo si pueden dar mejor o igual rendimiento.

+0

posible duplicado de [Obtener nombre de enum cuando se conoce el valor] (http://stackoverflow.com/questions/3327883/get-enum-name-when-value-is-known) – Heinzi

Respuesta

9

simple:

  • convertir la matriz de bytes en un int (ya sea manualmente o mediante la creación de una matriz de cuatro bytes y usando BitConverter.ToInt32)
  • emitir el int a AfpRecordId
  • llamada ToString en el resultado si es necesario (su línea de asunto sugiere obtener el nombre, pero la firma de su método solo habla del valor)

Por ejemplo:

private static AfpRecordId GetAfpRecordId(byte[] data) 
{ 
    // Alternatively, switch on data.Length and hard-code the conversion 
    // for lengths 1, 2, 3, 4 and throw an exception otherwise... 
    int value = 0; 
    foreach (byte b in data) 
    { 
     value = (value << 8) | b; 
    } 
    return (AfpRecordId) value; 
} 

Puede utilizar Enum.IsDefined para comprobar si los datos dada es en realidad una válida ID .

En cuanto al rendimiento, compruebe si algo simple le ofrece un rendimiento suficientemente bueno antes de buscar algo más rápido.

+0

me veo obligado a convertir el byte array a un int? Si lo hice bien, ¿el valor "BRG = 0xD3A8C6" no se reconoce como un byte []? –

+0

No creo que esté buscando una cuerda (pensé que originalmente también) Si nos fijamos en el tipo de devolución de su método de placa de caldera, devuelve un valor de la enumeración –

+3

@Duncan_McCloud: De hecho, '0xd3a8c6' es una 'int' literal, no una matriz de bytes. Si bien probablemente existan otras formas además de convertir la matriz de bytes en una int, de hecho se reducirían a algo similar y serían más complicadas. Este código debe ser extremadamente rápido, y es agradable y simple, ¿qué no te gusta de él? –

1

Si la matriz es de un tamaño conocido (voy a suponer que el tamaño es 3 como por su ejemplo) se puede añadir los elementos juntos y el elenco el resultado a la enumeración

private AfpRecordId GetAfpRecordId(byte[] tempData){ 
    var temp = tempData[0] * 256*256 + tempData[1] * 256 +tempData[2]; 
    return (AfpRecordId)temp; 
} 

una diferente enfoque sería utilizar el operador de desplazamiento en lugar

private AfpRecordId GetAfpRecordId(byte[] tempData){ 
    var temp = (int)tempData[0]<<16 + (int)tempData[1] * 8 +tempData[2]; 
    return (AfpRecordId)temp; 
} 
+2

Tenga en cuenta que esto supone que 'tempData' tiene tres elementos. Esa * puede * ser una suposición válida, pero puede no serlo. –

+0

Es una suposición válida :) –

+0

@JonSkeet sí asume que (basado en el código de muestra. He actualizado para que la respuesta destaque la suposición. Gracias por el comentario –

1

Suponiendo que tempData tiene 3 elementos de uso Enum.GetName (typeof (AfpRecordId), tempData[0] * 256*256 + tempData[1] * 256 +tempData[2]).

Cuestiones relacionadas