Enum.TryParse ?
Alors qu’on peut trouver int.TryParse, DateTime.TryParse dans le Framework .NET, la méthode Enum.TryParse n’existe pas.
La méthode intuitivement utilisée pour essayer de convertir une chaîne de caractères en une Enum est la suivante :
1: public static bool TryParse(String value, out T result)
2: {
3: result = default(T);
4: try
5: {
6: result = (T) Enum.Parse(typeof(T), value, true);
7: return true;
8: }
9: catch
10: {
11: return false;
12: }
13: }
L’inconvénient d’utiliser la méthode Enum.Parse lorsque la conversion n’est pas possible est que l’exécution est très très très lente ! L’exemple suivant met environ 2 secondes pour s’exécuter :
1: for (int i = 0; i < 1000; i++)
2: {
3: TryParse ("Hello !", out result);
4: }
Tout ca pour dire, que cette méthode peut s’avérer inutilisable dans certains cas. En fait ce qui est lent dans cette méthode, c’est le simple fait de lever une exception pour dire que la conversation a échoué (lever une exception c’est mou et c’est pour cela que ça doit rester exceptionnel).
Pour contourner le problème il existe différentes méthodes que vous trouverez un peu partout sur la toile. Attention, sachez que Enum.Parse gère TOUS les cas figures :
- Remplacement de certaines caractères spéciaux (+,-, _)
- Gestion des Flags
- Gestion de la case
Ceci n’est pas forcement vrai des méthodes que vous allez trouver ! Pour ma part, j’ai opté pour la solution simple qui ne gère même pas la case :
1: public static bool TryParse(string valueToParse, out T returnValue)
2: {
3: returnValue = default(T);
4: if (Enum.IsDefined(typeof(T), valueToParse))
5: {
6: returnValue = (T)Enum.Parse(typeof(T),valueToParse);
7: return true;
8: }
9: return false;
10: }
A noter, que si je refais le précédent test cette méthode ne mettra que 1 milliseconde.
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :