Comment obtenir une valeur enum à partir d'une chaîne en C #?

102

J'ai une énumération:

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, étant donné la chaîne HKEY_LOCAL_MACHINE, obtenir une valeur 0x80000002basée sur l'énumération?

Luiz Costa
la source

Réponses:

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

Avant .NET 4.5, vous deviez effectuer les opérations suivantes, qui sont plus sujettes aux erreurs et lèvent une exception lorsqu'une chaîne non valide est transmise:

(uint)Enum.Parse(typeof(baseKey), "HKEY_LOCAL_MACHINE")
Mehrdad Afshari
la source
1
Je me demande toujours pourquoi il n'y a toujours pas de surcharge générique à Enum.Parse. C'est en retard.
Falanwe
3
Il existe maintenant la méthode générique Enum.TryParse <TEnum> ().
Eugene Maksimov
27

En utilisant Enum.TryParse, vous n'avez pas besoin de la gestion des exceptions:

baseKey e;

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

Avec un peu de 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
}
Frank Bollack
la source
1
var value = (uint)Enum.Parse(typeof(basekey), "HKEY_LOCAL_MACHINE", true);

Cet extrait de code illustre l'obtention d'une valeur d'énumération à partir d'une chaîne. Pour convertir à partir d'une chaîne, vous devez utiliser la Enum.Parse()méthode statique , qui prend 3 paramètres. Le premier est le type d'énumération que vous souhaitez prendre en compte. La syntaxe est le mot-clé typeof()suivi du nom de la classe enum entre crochets. Le deuxième paramètre est la chaîne à convertir et le troisième paramètre boolindique si vous devez ignorer la casse lors de la conversion.

Enfin, notez que Enum.Parse()renvoie en fait une référence d'objet, cela signifie que vous devez explicitement la convertir dans le type enum requis ( string, intetc.).

Je vous remercie.

Rahul Bhat
la source
-2

Une autre solution peut être:

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

Ou juste:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;
George Findulov
la source
3
Comment cela convertit-il exactement une chaîne en valeur d'énumération?
Falanwe
Les énumérations se composent de deux composants: le nom et la valeur. Disons que le nom est "HKEY_LOCAL_MACHINE" et que 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 en tant que paramètre, vous pouvez effectuer un cast directement la variable enum avec laquelle vous travaillez.
George Findulov
4
Vous n'avez pas converti la chaîne "HKEY_LOCAL_MACHINE"en valeur, comme l'OP l'a demandé, vous avez converti le symbole HKEY_LOCAL_MACHINEen valeur. Des bêtes extrêmement différentes.
Falanwe