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?

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

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

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

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
}

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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.