Como obter um valor enum de string em C #?

102

Eu tenho um enum:

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

Como posso, dado o barbante HKEY_LOCAL_MACHINE , obter um valor com 0x80000002base no enum?

Luiz costa
fonte

Respostas:

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 do .NET 4.5, você tinha que fazer o seguinte, que é mais sujeito a erros e gera uma exceção quando uma string inválida é passada:

(uint)Enum.Parse(typeof(baseKey), "HKEY_LOCAL_MACHINE")
Mehrdad Afshari
fonte
1
Sempre me pergunto por que ainda não há sobrecarga genérica para Enum.Parse. Está muito atrasado.
Falanwe
3
Agora existe o método genérico Enum.ExperimenteParse <TEnum> ().
Eugene Maksimov,
27

Usando Enum.ExperimenteParse, você não precisa do tratamento de exceções:

baseKey e;

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

Com algum tratamento de erros ...

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
fonte
1
var value = (uint)Enum.Parse(typeof(basekey), "HKEY_LOCAL_MACHINE", true);

Este trecho de código ilustra a obtenção de um valor enum de uma string. Para converter de uma string, você precisa usar o Enum.Parse()método estático , que usa 3 parâmetros. O primeiro é o tipo de enum que você deseja considerar. A sintaxe é a palavra-chave typeof()seguida pelo nome da classe enum entre colchetes. O segundo parâmetro é a string a ser convertida e o terceiro parâmetro é uma boolindicação se você deve ignorar maiúsculas e minúsculas ao fazer a conversão.

Por fim, observe que, Enum.Parse()na verdade, retorna uma referência de objeto, o que significa que você precisa converter isso explicitamente para o tipo de enum necessário ( string, intetc).

Obrigado.

Rahul Bhat
fonte
-2

A solução alternativa pode ser:

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

Ou apenas:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;
George Findulov
fonte
3
Como exatamente isso converte uma string no valor de enum?
Falanwe
Enums consistem em dois componentes: nome e valor. Digamos que o nome seja "HKEY_LOCAL_MACHINE" e o valor "0x80000002". O método Enum.Parse () é inútil neste caso porque você pode converter o membro enum em uint e obter o valor - 2147483650. Enum.Parse (), é claro, fornece o mesmo resultado, mas em vez de codificar uma string como um parâmetro, você pode converter diretamente a variável enum com a qual você está trabalhando.
George Findulov
4
Você não converteu a string "HKEY_LOCAL_MACHINE"para o valor, como o OP pediu, você converteu o símbolo HKEY_LOCAL_MACHINEpara o valor. Bestas totalmente diferentes.
Falanwe