Bagaimana cara mendapatkan nilai enum dari string di C #?

102

Saya memiliki enum:

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

Bagaimana saya, diberi string HKEY_LOCAL_MACHINE, mendapatkan nilai 0x80000002berdasarkan enum?

Luiz Costa
sumber

Jawaban:

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

Sebelum .NET 4.5, Anda harus melakukan hal berikut, yang lebih rentan terhadap kesalahan dan membuat pengecualian ketika string yang tidak valid dilewatkan:

(uint)Enum.Parse(typeof(baseKey), "HKEY_LOCAL_MACHINE")
Mehrdad Afshari
sumber
1
Saya selalu bertanya-tanya mengapa masih tidak ada overload generik ke Enum.Parse. Sudah lama terlambat.
Falanwe
3
Sekarang ada metode Enum.TryParse <TEnum> () generik.
Eugene Maksimov
27

Menggunakan Enum.TryParse, Anda tidak memerlukan penanganan Exception:

baseKey e;

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

Dengan beberapa penanganan kesalahan ...

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

Potongan kode ini menggambarkan perolehan nilai enum dari sebuah string. Untuk mengonversi dari string, Anda perlu menggunakan Enum.Parse()metode statis , yang membutuhkan 3 parameter. Yang pertama adalah jenis enum yang ingin Anda pertimbangkan. Sintaksnya adalah kata kunci yang typeof()diikuti dengan nama kelas enum dalam tanda kurung. Parameter kedua adalah string yang akan dikonversi, dan parameter ketiga adalah boolpenunjuk apakah Anda harus mengabaikan case saat melakukan konversi.

Terakhir, perhatikan bahwa Enum.Parse()sebenarnya mengembalikan referensi objek, itu berarti Anda perlu mengonversinya secara eksplisit ke jenis enum yang diperlukan ( string, intdll).

Terima kasih.

Rahul Bhat
sumber
-2

Solusi alternatif dapat berupa:

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

Atau hanya:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;
George Findulov
sumber
3
Bagaimana tepatnya cara itu mengubah string menjadi nilai enum?
Falanwe
Enum terdiri dari dua komponen: nama dan nilai. Misalkan namanya adalah "HKEY_LOCAL_MACHINE" dan nilainya adalah "0x80000002". Metode Enum.Parse () tidak berguna dalam kasus ini karena Anda dapat mentransmisikan anggota enum ke uint dan mendapatkan nilai - 2147483650. Enum.Parse () tentu saja memberikan hasil yang sama tetapi alih-alih melakukan hardcode string sebagai parameter, Anda dapat mentransmisikan langsung variabel enum yang Anda kerjakan.
George Findulov
4
Anda tidak mengonversi string "HKEY_LOCAL_MACHINE"menjadi nilai, seperti yang diminta OP, Anda mengonversi simbol HKEY_LOCAL_MACHINEmenjadi nilai. Binatang buas yang sangat berbeda.
Falanwe