2009-10-16 6 views
79

J'ai un ENUM:Comment obtenir une valeur enum à partir d'une chaîne en C#?

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

Comment puis-je, compte tenu de la chaîne HKEY_LOCAL_MACHINE, obtenir une valeur 0x80000002 sur la base ENUM?

Répondre

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

Avant 4.5 .NET, il fallait faire ce qui suit, qui est plus sujette aux erreurs et génère une exception lorsqu'une chaîne non valide est passé:

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

Je me demande toujours pourquoi il n'y a toujours pas de surcharge générique à Enum.Parse. Il est longtemps attendu. – Falanwe

+2

Maintenant, il existe la méthode générique Enum.TryParse (). –

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

Avec une gestion des erreurs ...

uint key = 0; 
string s = "HKEY_LOCAL_MACHINE"; 
try 
{ 
    key = (uint)Enum.Parse(typeof(baseKey), s); 
} 
catch(ArgumentException) 
{ 
    //unknown string or s is null 
} 
25

l'utilisation Enum.TryParse vous n'avez pas besoin de la gestion des exceptions:

baseKey e; 

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

Autre solution peut être:

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

Ou tout simplement:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE; 
+3

Comment cela convertit-il exactement une chaîne en valeur enum? – Falanwe

+0

Les énumérations sont constituées de deux éléments: nom et valeur. Disons que le nom est "HKEY_LOCAL_MACHINE" et la valeur est "0x80000002". La méthode Enum.Parse() est inutile dans ce cas car vous pouvez convertir le membre enum en uint et obtenir la valeur - 2147483650. Enum.Parse() donne bien sûr le même résultat mais au lieu de coder en dur une chaîne comme paramètre vous pouvez lancer directement la variable enum avec laquelle vous travaillez. –

+3

Vous n'avez pas converti la chaîne '" HKEY_LOCAL_MACHINE "' à la valeur, comme l'OP l'a demandé, vous avez converti le symbole 'HKEY_LOCAL_MACHINE' à la valeur. Bêtes follement différentes. – Falanwe

1
var value = (uint)Enum.Parse(typeof(basekey), "HKEY_LOCAL_MACHINE", true); 

Cet extrait de code illustre l'obtention d'une valeur ENUM d'une chaîne. Pour convertir à partir d'une chaîne, vous devez utiliser la méthode statique Enum.Parse(), qui prend 3 paramètres. Le premier est le type d'énumération que vous voulez considérer. La syntaxe est le mot clé typeof() suivi du nom de la classe enum entre parenthèses. Le deuxième paramètre est la chaîne à convertir et le troisième paramètre est un bool indiquant si vous devez ignorer la casse lors de la conversion. Enfin, notez que Enum.Parse() renvoie réellement une référence d'objet, ce qui signifie que vous devez convertir explicitement ce nombre en le type enum requis (string, int etc.).

Merci.

Questions connexes