¿Cómo obtener un valor de enumeración de una cadena en C #?

102

Tengo una enumeración:

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

¿Cómo puedo, dada la cadena HKEY_LOCAL_MACHINE, obtener un valor 0x80000002basado en la enumeración?

Luiz Costa
fuente

Respuestas:

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 */ }

Antes de .NET 4.5, tenía que hacer lo siguiente, que es más propenso a errores y genera una excepción cuando se pasa una cadena no válida:

(uint)Enum.Parse(typeof(baseKey), "HKEY_LOCAL_MACHINE")
Mehrdad Afshari
fuente
1
Siempre me pregunto por qué todavía no hay una sobrecarga genérica en Enum.Parse. Hace mucho que debió haberlo hecho.
Falanwe
3
Ahora existe el método genérico Enum.TryParse <TEnum> ().
Eugene Maksimov
27

Usando Enum.TryParse no necesita el manejo de excepciones:

baseKey e;

if ( Enum.TryParse(s, out e) )
{
 ...
}
Nigel
fuente
20
var value = (uint) Enum.Parse(typeof(baseKey), "HKEY_LOCAL_MACHINE");  
Joseph
fuente
16

Con algún manejo de errores ...

uint key = 0;
string s = "HKEY_LOCAL_MACHINE";
try
{
   key = (uint)Enum.Parse(typeof(baseKey), s);
}
catch(ArgumentException)
{
   //unknown string or s is null
}
Frank Bollack
fuente
1
var value = (uint)Enum.Parse(typeof(basekey), "HKEY_LOCAL_MACHINE", true);

Este fragmento de código ilustra la obtención de un valor de enumeración de una cadena. Para convertir de una cadena, debe usar el Enum.Parse()método estático , que toma 3 parámetros. El primero es el tipo de enumeración que desea considerar. La sintaxis es la palabra clave typeof()seguida del nombre de la clase enum entre paréntesis. El segundo parámetro es la cadena que se va a convertir, y el tercer parámetro boolindica si debe ignorar las mayúsculas y minúsculas mientras realiza la conversión.

Finalmente, tenga en cuenta que en Enum.Parse()realidad devuelve una referencia de objeto, lo que significa que debe convertirlo explícitamente al tipo de enumeración requerido ( string, intetc.).

Gracias.

Rahul Bhat
fuente
-2

La solución alternativa puede ser:

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

O solo:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;
George Findulov
fuente
3
¿Cómo convierte eso exactamente una cadena en el valor de enumeración?
Falanwe
Las enumeraciones constan de dos componentes: nombre y valor. Digamos que el nombre es "HKEY_LOCAL_MACHINE" y el valor es "0x80000002". El método Enum.Parse () es inútil en este caso porque puede convertir el miembro enum a uint y obtener el valor - 2147483650. Enum.Parse (), por supuesto, da el mismo resultado, pero en lugar de codificar una cadena como parámetro, puede convertir directamente la variable de enumeración con la que está trabajando.
George Findulov
4
No convirtió la cadena "HKEY_LOCAL_MACHINE"en el valor, como pidió el OP, convirtió el símbolo HKEY_LOCAL_MACHINEen el valor. Bestias tremendamente diferentes.
Falanwe