Как получить значение перечисления из строки в 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на основе перечисления?

Луис Коста
источник

Ответы:

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. Давно пора.
Falanwe
3
Теперь есть общий метод Enum.TryParse <TEnum> ().
Евгений Максимов
27

Используя Enum.TryParse, вам не нужна обработка исключений:

baseKey e;

if ( Enum.TryParse(s, out e) )
{
 ...
}
Найджел
источник
20
var value = (uint) Enum.Parse(typeof(baseKey), "HKEY_LOCAL_MACHINE");  
Джозеф
источник
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()за которым следует имя класса перечисления в скобках. Второй параметр - это строка, которая должна быть преобразована, а третий параметр boolуказывает, следует ли игнорировать регистр при выполнении преобразования.

Наконец, обратите внимание, что Enum.Parse()фактически возвращает ссылку на объект, а это означает, что вам нужно явно преобразовать ее в требуемый тип перечисления ( stringи intт. Д.).

Спасибо.

Рахул Бхат
источник
-2

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

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

Или просто:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;
Георгий Финдулов
источник
3
Как именно это преобразует строку в значение перечисления?
Falanwe
Перечисления состоят из двух компонентов: имени и значения. Допустим, имя - «HKEY_LOCAL_MACHINE», а значение - «0x80000002». Метод Enum.Parse () в этом случае бесполезен, потому что вы можете преобразовать член перечисления в uint и получить значение - 2147483650. Enum.Parse (), конечно, дает тот же результат, но вместо жесткого кодирования строки в качестве параметра вы можете привести непосредственно переменную перечисления, с которой вы работаете.
Георгий Финдулов,
4
Вы не преобразовали строку "HKEY_LOCAL_MACHINE"в значение, как просил OP, вы преобразовали символ HKEY_LOCAL_MACHINEв значение. Дико разные звери.
Falanwe