Jak uzyskać wartość wyliczenia z ciągu w C #?

102

Mam wyliczenie:

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

W jaki sposób, biorąc pod uwagę ciąg HKEY_LOCAL_MACHINE, mogę uzyskać wartość 0x80000002na podstawie wyliczenia?

Luiz Costa
źródło

Odpowiedzi:

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

Przed .NET 4.5 trzeba było wykonać następujące czynności, które są bardziej podatne na błędy i zgłaszają wyjątek, gdy przekazywany jest nieprawidłowy ciąg:

(uint)Enum.Parse(typeof(baseKey), "HKEY_LOCAL_MACHINE")
Mehrdad Afshari
źródło
1
Zawsze zastanawiam się, dlaczego nadal nie ma ogólnego przeciążenia dla Enum.Parse. To jest od dawna.
Falanwe
3
Teraz jest ogólna metoda Enum.TryParse <TEnum> ().
Eugene Maksimov
27

Używając Enum.TryParse nie potrzebujesz obsługi wyjątków:

baseKey e;

if ( Enum.TryParse(s, out e) )
{
 ...
}
Nigel
źródło
20
var value = (uint) Enum.Parse(typeof(baseKey), "HKEY_LOCAL_MACHINE");  
Józef
źródło
16

Z pewną obsługą błędów ...

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
źródło
1
var value = (uint)Enum.Parse(typeof(basekey), "HKEY_LOCAL_MACHINE", true);

Ten fragment kodu ilustruje uzyskiwanie wartości wyliczenia z ciągu. Aby przekonwertować z łańcucha, musisz użyć Enum.Parse()metody statycznej , która przyjmuje 3 parametry. Pierwszy to typ wyliczenia, który chcesz wziąć pod uwagę. Składnia to słowo kluczowe, typeof()po którym następuje nazwa klasy wyliczeniowej w nawiasach. Drugi parametr to łańcuch do konwersji, a trzeci parametr boolwskazuje, czy podczas konwersji należy ignorować wielkość liter.

Wreszcie należy pamiętać, że Enum.Parse()faktycznie zwraca referencję do obiektu, co oznacza, że musisz jawnie przekonwertować to do wymaganego typu enum ( string, intetc).

Dziękuję Ci.

Rahul Bhat
źródło
-2

Alternatywnym rozwiązaniem może być:

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

Lub tylko:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;
George Findulov
źródło
3
Jak dokładnie to konwertuje ciąg na wartość wyliczenia?
Falanwe
Wyliczenia składają się z dwóch składników: nazwy i wartości. Powiedzmy, że nazwa to „HKEY_LOCAL_MACHINE”, a wartość to „0x80000002”. Metoda Enum.Parse () jest w tym przypadku bezużyteczna, ponieważ można rzutować element członkowski wyliczenia na uint i uzyskać wartość - 2147483650. Enum.Parse () oczywiście daje ten sam wynik, ale zamiast zakodowania na stałe ciągu jako parametru można rzutować bezpośrednio zmienną wyliczeniową, z którą pracujesz.
George Findulov
4
Nie przekonwertowałeś ciągu "HKEY_LOCAL_MACHINE"na wartość, zgodnie z zapytaniem OP, przekonwertowałeś symbol HKEY_LOCAL_MACHINEna wartość. Dzikie różne bestie.
Falanwe