Як отримати значення перерахунку з рядка в C #?


102

У мене є перерахунок:

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

Як я можу, з огляду на рядок HKEY_LOCAL_MACHINE, отримати значення 0x80000002на основі enum?

Відповіді:


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

Перед .NET 4.5 вам слід було виконати наступне, що є більш схильним до помилок і викидає виняток, коли передається недійсна рядок:

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

1
Мені завжди цікаво, чому досі немає загальної перевантаження Enum.Parse. Давно назріло.
Фаланве

3
Тепер існує загальний метод Enum.TryParse <TEnum> ().
Євген Максимов

27

Використовуючи Enum.TryParse, вам не потрібно обробляти винятки:

baseKey e;

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


16

З деякими помилками обробки ...

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

Цей фрагмент коду ілюструє отримання значення перерахунку з рядка. Для перетворення з рядка потрібно використовувати статичний Enum.Parse()метод, який приймає 3 параметри. Перший - це тип перерахунку, який ви хочете врахувати. Синтаксис - це ключове слово, typeof()за яким в дужках позначається назва класу enum. Другий параметр - це рядок, який потрібно перетворити, а третій параметр - це boolвказівка, чи слід ігнорувати випадок, виконуючи перетворення.

Нарешті, зверніть увагу на це Enum.Parse() на насправді повертає посилання на об'єкт, що означає , що необхідно явно перетворити це в необхідний тип перерахування ( string, і intт.д.).

Дякую.


-2

Альтернативним рішенням може бути:

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

Або просто:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;

3
Як саме це перетворює рядок у значення enum?
Фаланве

Енуми складаються з двох компонентів: ім'я та значення. Скажімо, назва "HKEY_LOCAL_MACHINE", а значення - "0x80000002". Метод Enum.Parse () в даному випадку марний, тому що ви можете привласнити члена enum до uint та отримати значення - 2147483650. Enum.Parse (), звичайно, дає такий же результат, але замість жорсткого кодування рядка як параметру, який ви можете передавати безпосередньо змінної enum, з якою ви працюєте.
Джордж Фіндулов

4
Ви не перетворили рядок "HKEY_LOCAL_MACHINE"у значення, як запитував ОП, ви перетворили символ HKEY_LOCAL_MACHINEу значення. Дико різні звірі.
Фаланве
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.