¿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?

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")

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) )
{
 ...
}

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

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
}

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.


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.