2009-10-16 11 views
79

tengo una enumeración:¿Cómo obtener un valor enum de la cadena en C#?

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 puede I, dada la cadena HKEY_LOCAL_MACHINE, obtener un valor 0x80000002 basado en la enumeración?

Respuesta

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

Antes de .NET 4.5, que tenía que hacer lo siguiente, que es más propenso a errores y lanza 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 para Enum.Parse. Hace mucho tiempo. – Falanwe

+2

Ahora está el método genérico Enum.TryParse (). –

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

Con un poco de control 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 
} 
25

Usando Enum.TryParse que no es necesario el manejo de excepciones:

baseKey e; 

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

solución alternativo puede ser:

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

O simplemente:

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

¿Cómo exactamente eso convierte una cadena al valor enum? – Falanwe

+0

Los mensajes 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. Por supuesto, Enum.Parse() da el mismo resultado, pero en lugar de codificar una cadena como un parámetro puede lanzar directamente la variable enum con la que estás trabajando. –

+3

No ha convertido la cadena '" HKEY_LOCAL_MACHINE "' en el valor, ya que OP ha pedido que haya convertido el símbolo 'HKEY_LOCAL_MACHINE' en el valor. Bestias salvajemente diferentes. – Falanwe

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 desde una cadena, debe usar el método estático Enum.Parse(), 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 convertirá, y el tercer parámetro es un bool que indica si debe ignorar el caso al hacer la conversión.

Por último, tenga en cuenta que en realidad Enum.Parse() devuelve una referencia a un objeto, que significa que usted necesita para convertir explícitamente al tipo de enumeración requerida (string, int etc).

Gracias.

Cuestiones relacionadas