Wie erhalte ich einen Aufzählungswert aus einem String in C #?


102

Ich habe eine Aufzählung:

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

Wie kann ich angesichts der Zeichenfolge HKEY_LOCAL_MACHINEeinen Wert erhalten, 0x80000002der auf der Aufzählung basiert?

Antworten:


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

Vor .NET 4.5 mussten Sie Folgendes tun, was fehleranfälliger ist und eine Ausnahme auslöst, wenn eine ungültige Zeichenfolge übergeben wird:

(uint)Enum.Parse(typeof(baseKey), "HKEY_LOCAL_MACHINE")

1
Ich frage mich immer, warum Enum.Parse immer noch keine generische Überlastung aufweist. Es ist längst überfällig.
Falanwe

3
Jetzt gibt es die generische Methode Enum.TryParse <TEnum> ().
Eugene Maksimov

27

Mit Enum.TryParse benötigen Sie keine Ausnahmebehandlung:

baseKey e;

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

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

16

Mit etwas Fehlerbehandlung ...

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

Dieses Code-Snippet veranschaulicht das Abrufen eines Aufzählungswerts aus einer Zeichenfolge. Um aus einer Zeichenfolge zu konvertieren, müssen Sie die statische Enum.Parse()Methode verwenden, die 3 Parameter akzeptiert. Die erste ist die Art der Aufzählung, die Sie berücksichtigen möchten. Die Syntax ist das Schlüsselwort, typeof()gefolgt vom Namen der Enum-Klasse in Klammern. Der zweite Parameter ist die zu konvertierende Zeichenfolge, und der dritte Parameter gibt an bool, ob Sie bei der Konvertierung die Groß- und Kleinschreibung ignorieren sollten.

Schließlich ist zu beachten , dass Enum.Parse()tatsächlich gibt einen Objektverweis, das bedeutet , Sie müssen ausdrücklich diese Art der erforderlichen Enum umwandeln ( string, intusw.).

Danke dir.


-2

Alternative Lösung kann sein:

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

Oder nur:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;

3
Wie genau konvertiert das einen String in den Enum-Wert?
Falanwe

Aufzählungen bestehen aus zwei Komponenten: Name und Wert. Angenommen, der Name lautet "HKEY_LOCAL_MACHINE" und der Wert lautet "0x80000002". Die Enum.Parse () -Methode ist in diesem Fall nutzlos, da Sie das enum-Member in uint umwandeln und den Wert 2147483650 erhalten können. Enum.Parse () liefert natürlich das gleiche Ergebnis, aber anstatt eine Zeichenfolge als Parameter fest zu codieren, können Sie sie umwandeln direkt die Enum-Variable, mit der Sie arbeiten.
George Findulov

4
Sie haben die Zeichenfolge nicht "HKEY_LOCAL_MACHINE"in den Wert konvertiert , wie im OP gefordert, sondern das Symbol HKEY_LOCAL_MACHINEin den Wert konvertiert . Wild verschiedene Tiere.
Falanwe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.