2011-11-02 22 views
6

ho dichiarato quanto segue Enum:Ottiene il nome Enum in base al valore Enum

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

e voglio recuperare l'oggetto enum da è valore:

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

chiamate Esempio:

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

//tempId should be equals to AfpRecordId.BRG 

Vorrei anche usare linq o lambda, solo se possono fornire prestazioni migliori o uguali.

+0

possibile duplicato di [Ottieni il nome enum quando il valore è noto] (http://stackoverflow.com/questions/3327883/get-enum-name-when-value-is-known) – Heinzi

risposta

9

semplice:

  • convertire la matrice di byte in un int (manualmente o creando un array di quattro byte e utilizzando BitConverter.ToInt32)
  • Cast l'int di AfpRecordId
  • chiamata ToString sul risultato se necessario (la riga dell'oggetto suggerisce di ottenere il nome, ma la firma del metodo parla solo del valore)

Per esempio:

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; 
} 

È possibile utilizzare Enum.IsDefined per verificare se i dati dato è in realtà un valida ID.

Per quanto riguarda le prestazioni, verifica se qualcosa di semplice ti offre prestazioni sufficientemente buone prima di cercare qualcosa di più veloce.

+0

sono obbligato a convertire il byte array a un int? Se ho capito bene il valore "BRG = 0xD3A8C6" non è riconosciuto come byte []? –

+0

Non penso che stia cercando una stringa (lo pensavo anch'io in origine) Se si guarda il tipo di ritorno del suo metodo di piastra di riscaldamento, restituisce un valore dell'enum –

+3

@Duncan_McCloud: Infatti, '0xd3a8c6' è un 'int' letterale, non un array di byte. Mentre ci sono probabilmente altri modi oltre a convertire l'array di byte in un int, si sarebbero effettivamente ridotti a qualcosa di simile, e sarebbero stati più complicati. Questo codice dovrebbe essere estremamente veloce, ed è bello e semplice - cosa non ti piace a riguardo? –

1

Se la matrice è di dimensioni note (Si assume la dimensione è 3 secondo il tuo esempio) è possibile aggiungere gli elementi insieme e il cast il risultato al enum

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

un diverso approccio sarebbe quello di utilizzare l'operatore di spostamento invece

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

Si noti che questo presuppone che 'tempData' ha tre elementi. Questo * può * essere un presupposto valido, ma potrebbe non esserlo. –

+0

È un'ipotesi valida :) –

+0

@JonSkeet sì, si presume che (basato sul codice di esempio. Ho aggiornato in modo che la risposta evidenzia l'ipotesi. Grazie per il commento –

1

Supponendo che tempData ha 3 elementi usano Enum.GetName (typeof (AfpRecordId), tempData[0] * 256*256 + tempData[1] * 256 +tempData[2]).