Je travaille souvent avec des enums, comme beaucoup d'entre vous sans doute. Mais travailler avec m'a souvent posé un petit problème.
Les valeurs possibles ne sont pas toujours Human Readable. J'entend par là qu'on ne peut pas les afficher directement ou alors le résultat n'est pas "propre".
Prenons l'Enum suivante :
Public Enum EtatEnum
ouvert
ferme
encoursouverture
encoursfermeture
End Enum
Si vous devez afficher à l'écran la valeur correspondante, vous obtiendrez quelque chose d'assez peu "User Friendly" du type "L'objet est à l'etat1"
J'ai donc creusé un petit peu, et j'ai trouvé le DescriptionAttribute. Du coup, rien à coder ou presque et il laisse entrevoir des possibilités assez intéressantes.
Transformons maintenant un peu notre Enum pour prendre en compte le DescriptionAttribute :
Public Enum EtatEnum
<Description("ouvert")> ouvert
<Description("fermé")> ferme
<Description("en cours d'ouverture")> encoursouverture
<Description("en cours de fermeture")> encoursfermeture
End Enum
Comme vous le constatez, les descriptions sont plus amicales que le résultat qu'on obtiendrait avec un ToString(). Mais comment l'utiliser. C'est assez simple, le code tient en quelques lignes :
Public Shared Function GetDescription(ByVal value As [Enum]) As String
Dim fi As System.Reflection.FieldInfo = value.GetType().GetField(value.ToString)
Dim attributes() As Object = fi.GetCustomAttributes(GetType(DescriptionAttribute), False)
If attributes.Length = 1 Then
Dim da As DescriptionAttribute = DirectCast(attributes(0), DescriptionAttribute)
If Not String.IsNullOrEmpty(da.Description) Then
Return da.Description
End If
End If
Return value.ToString
End Function
En gros, on récupère les infos sur l'enum dont on veut connaître la value. Ensuite, on essaie de récupérer l'instance du DescriptionAttribute associé. Si il existe, on regarde quand même que la Description n'est pas vide et on retourne sa valeur. Dans tous les autres cas, un petit ToString fera l'affaire.
Voici une petite démonstration :
Sub Main()
Console.WriteLine("Sans l'utilisation du DescriptionAttribute")
Console.WriteLine("Le coffre est " & EtatEnum.encoursouverture.ToString)
Console.WriteLine()
Console.WriteLine("Avec l'utilisation du DescriptionAttribute")
Console.WriteLine("Le coffre est " & EnumHelper.GetDescription(EtatEnum.encoursouverture))
Console.ReadKey(True)
End Sub
Qui donne :
Sans l'utilisation du DescriptionAttribute
Le coffre est encoursouverture
Avec l'utilisation du DescriptionAttribute
Le coffre est en cours d'ouverture
Vous voyez, c'est à peine plus compliqué qu'un ToString, et au moins, c'est un peu plus compréhensible. Pour les possibilités offertes, je vous laisse creuser un peu