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?

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

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) )
{
 ...
}

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

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
}

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.


-2

Solusi alternatif dapat berupa:

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

Atau hanya:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.