2009-10-16 18 views
79

Ho un enum:Come ottenere un valore enum dalla stringa in C#?

public enum baseKey : uint 
{ 
    HKEY_CLASSES_ROOT = 0x80000000, 
    HKEY_CURRENT_USER = 0x80000001, 
    HKEY_LOCAL_MACHINE = 0x80000002, 
    HKEY_USERS = 0x80000003, 
    HKEY_CURRENT_CONFIG = 0x80000005 
} 

come posso, dando la stringa HKEY_LOCAL_MACHINE, ottenere un valore 0x80000002 basato sul enum?

risposta

143
baseKey choice; 
if (Enum.TryParse("HKEY_LOCAL_MACHINE", out choice)) { 
    uint value = (uint)choice; 

    // `value` is what you're looking for 

} else { /* error: the string was not an enum member */ } 

Prima di .NET 4.5, si aveva a che fare quanto segue, che è più soggetto a errori e genera un'eccezione quando viene passata una stringa non valida:

(uint)Enum.Parse(typeof(baseKey), "HKEY_LOCAL_MACHINE") 
+1

Mi chiedo sempre perché non esiste ancora un sovraccarico generico per Enum.Parse. È in ritardo da tempo. – Falanwe

+2

Ora c'è il metodo generico Enum.TryParse (). –

17
var value = (uint) Enum.Parse(typeof(baseKey), "HKEY_LOCAL_MACHINE"); 
15

Con un po 'la gestione degli errori ...

uint key = 0; 
string s = "HKEY_LOCAL_MACHINE"; 
try 
{ 
    key = (uint)Enum.Parse(typeof(baseKey), s); 
} 
catch(ArgumentException) 
{ 
    //unknown string or s is null 
} 
25

Utilizzando Enum.TryParse non è necessario la gestione delle eccezioni:

baseKey e; 

if (Enum.TryParse(s, out e)) 
{ 
... 
} 
-1

soluzione alternativa può essere:

baseKey hKeyLocalMachine = baseKey.HKEY_LOCAL_MACHINE; 
uint value = (uint)hKeyLocalMachine; 

O semplicemente:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE; 
+3

In che modo esattamente converte una stringa nel valore enum? – Falanwe

+0

Le enumerazioni sono costituite da due componenti: nome e valore. Diciamo che il nome è "HKEY_LOCAL_MACHINE" e il valore è "0x80000002". In questo caso, il metodo Enum.Parse() è inutile perché è possibile eseguire il cast dell'enumerazione su uint e ottenere il valore - 2147483650. Enum.Parse() fornisce ovviamente lo stesso risultato, ma invece di eseguire l'hardcoding di una stringa come parametro è possibile eseguire il cast direttamente la variabile enum con cui stai lavorando. –

+3

Non hai convertito la stringa '" HKEY_LOCAL_MACHINE "' nel valore, come richiesto dall'OP, hai convertito il simbolo 'HKEY_LOCAL_MACHINE' nel valore. Animali selvaggiamente diversi. – Falanwe

1
var value = (uint)Enum.Parse(typeof(basekey), "HKEY_LOCAL_MACHINE", true); 

Questo frammento di codice illustra l'ottenimento di un valore di enumerazione da una stringa. Per convertire da una stringa, è necessario utilizzare il metodo statico Enum.Parse(), che accetta 3 parametri. Il primo è il tipo di enum che vuoi prendere in considerazione. La sintassi è la parola chiave typeof() seguita dal nome della classe enum tra parentesi. Il secondo parametro è la stringa da convertire e il terzo parametro è un bool che indica se è necessario ignorare il caso durante la conversione.

Infine, ricordiamo che Enum.Parse() restituisce in realtà un riferimento a un oggetto, che significa che è necessario per convertire in modo esplicito questo al desiderato tipo enum (string, int ecc).

Grazie.

Problemi correlati