Come ottenere un valore enum dalla stringa in C #?


102

Ho un'enumerazione:

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, data la stringa HKEY_LOCAL_MACHINE, ottenere un valore 0x80000002basato sull'enumerazione?

Risposte:


173
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, era necessario eseguire le seguenti operazioni, 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 ci sia ancora un sovraccarico generico per Enum.Parse. È attesa da tempo.
Falanwe

3
Ora c'è il metodo generico Enum.TryParse <TEnum> ().
Eugene Maksimov

27

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

baseKey e;

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

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

16

Con un po 'di 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
}

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

Questo frammento di codice illustra come ottenere un valore enum da una stringa. Per convertire da una stringa, è necessario utilizzare il Enum.Parse()metodo statico , che accetta 3 parametri. Il primo è il tipo di enumerazione che vuoi considerare. 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 boolindica se è necessario ignorare le maiuscole / minuscole durante la conversione.

Infine, nota che in Enum.Parse()realtà restituisce un riferimento a un oggetto, il che significa che devi convertirlo esplicitamente nel tipo di enum richiesto ( string, intecc.).

Grazie.


-2

La 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

Gli enum sono costituiti da due componenti: nome e valore. Supponiamo che il nome sia "HKEY_LOCAL_MACHINE" e il valore sia "0x80000002". Il metodo Enum.Parse () è inutile in questo caso perché puoi eseguire il cast del membro enum su uint e ottenere il valore - 2147483650. Enum.Parse () ovviamente fornisce lo stesso risultato ma invece di codificare una stringa come parametro puoi eseguire il cast direttamente la variabile enum con cui stai lavorando.
George Findulov

4
Non hai convertito la stringa "HKEY_LOCAL_MACHINE"nel valore, come richiesto dall'OP, hai convertito il simbolo HKEY_LOCAL_MACHINEnel valore. Bestie selvaggiamente diverse.
Falanwe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.