C # 'da dizeden bir enum değeri nasıl alınır?


102

Bir numaram var:

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

Dize verildiğinde , numaralandırmaya dayalı HKEY_LOCAL_MACHINEbir değeri nasıl elde edebilirim 0x80000002?

Yanıtlar:


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'ten önce, aşağıdakileri yapmanız gerekiyordu; bu, daha fazla hataya meyillidir ve geçersiz bir dize geçirildiğinde bir istisna atar:

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

1
Enum.Parse'a neden hala genel bir aşırı yükleme olmadığını hep merak etmişimdir. Çok gecikti.
Falanwe

3
Artık genel Enum. TryParse <TEnum> () yöntemi var.
Eugene MAKSIMOV

27

Enum. TryParse kullanarak İstisna işlemeye ihtiyacınız yoktur:

baseKey e;

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

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

16

Bazı hata işlemleriyle ...

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

Bu kod parçacığı, bir dizeden bir enum değeri almayı gösterir. Bir dizeden dönüştürmek Enum.Parse()için 3 parametre alan statik yöntemi kullanmanız gerekir . Birincisi, göz önünde bulundurmak istediğiniz numaralandırma türüdür. Sözdizimi, typeof()parantez içinde enum sınıfının adı ve ardından gelen anahtar sözcüktür. İkinci parametre, dönüştürülecek dizedir ve üçüncü parametre, booldönüştürmeyi yaparken büyük / küçük harf durumunu göz ardı etmeniz gerekip gerekmediğini belirtir.

Son olarak, not o Enum.Parse()aslında bir nesne başvurusu, açıkça gerekli enum türü (bu dönüştürmek gerektiğini araçları döndürür string, intvb.)

Teşekkür ederim.


-2

Alternatif çözüm şunlar olabilir:

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

Ya da sadece:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;

3
Bu, bir dizeyi enum değerine tam olarak nasıl dönüştürür?
Falanwe

Numaralandırmalar iki bileşenden oluşur: ad ve değer. Adın "HKEY_LOCAL_MACHINE" ve değerin "0x80000002" olduğunu varsayalım. Enum.Parse () yöntemi bu durumda işe yaramaz çünkü enum üyesini uint'e çevirebilir ve 2147483650 değerini alabilirsiniz. Enum.Parse () elbette aynı sonucu verir, ancak parametre olarak bir dizeyi sabit kodlamak yerine çevirebilirsiniz doğrudan birlikte çalıştığınız enum değişkeni.
George Findulov

4
Dizeyi "HKEY_LOCAL_MACHINE"değere dönüştürmediniz, OP'nin sorduğu gibi sembolü HKEY_LOCAL_MACHINEdeğere dönüştürdünüz . Çılgınca farklı canavarlar.
Falanwe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.