mardi 15 juin 2010

Enum Java-like en C#

Si vous avez l'habitude de programmer en Java et que vous passez dans le monde de Microsoft avec le C#, vous vous êtes peut-être déja demandé pourquoi les Enums C# sont aussi primitif que les enums en C. En effet, contrairement à Java(à partir de la version 5), il n'est pas possible d'ajouter des propriétés sur les Enums C#. Serait-ce une fonctionnalité propre et uniquement valable pour les développeurs Java ?

En effectuant plusieurs recherches sur internet, j'ai trouvé une solution qui permet de simuler le fonctionnement des enum java sur le .NET framework en C#.

La solution que je vais vous présenter consiste à utiliser les attributs sur les valeurs de l'énumération et d'utiliser la reflection pour récupérer les valeurs des attributs.

L'exemple le plus fréquent en Java est l'énumération des planètes du système solaire sur lesquelles il est possible de récupérer des informations complémentaires tel que le diamètre ou le poids de la planète, par exemple.

Alors en pratique comment faire ?

Premièrement, il est nécessaire de définir les attributs à utiliser, par exemple l'attribut MassAttribute:
L'attribut hérite de la classe Attribute, on lui définit un constructeur prenant un paramètre de type double et une propriété Mass avec un getteur qui retourne la valeur de la masse. Une fois définie, il est possible d'ajouter les attributs sur les valeurs de l'enum :
Maintenant que notre énumération de planètes est décorée de ses attributs, il est possible de récupérer les valeurs stockées dans ces attributs via la réflection. La méthode GetCustomAttributes de la classe FieldInfo permet de récupérer les attributs de la classe. Cette méthode prend en paramètre le type de l'attribut ainsi qu'un booléen qui détermine si il faut aller chercher les attributs dans les classes héritées ou non(Il existe également une signature de cette méthode qui ne prend pas le type de l'attribut mais cette dernière retourne, évidemment, tous les attributs liés au Type). Si vous avez défini que votre attribut Mass est unique pour chaque élement de l'énum, il suffit de récupérer l'élement d'index 0 de la liste des attributs retourné par la fonction. Ce qui donne :
Enfin, pour avoir le meme comportement que les enums Java, il est nécessaire de pouvoir récuperer la valeur de l'attribut en appelant une méthode directement sur l'objet de l'énumération. Pour ce faire nous allons définir une classe static avec des méthode pour étendre l'énum. Nous allons donc utiliser le fait que le C# permet d'étendre des classes en leur rajoutant de nouvelles méthodes avec les Extension methods(http://msdn.microsoft.com/en-us/library/bb383977.aspx) :
Ainsi, il est donc possible de faire appel à la méthode GetMass sur une valeur de l'énumération Planets que nous avons précédemment créé et d'avoir un fonctionnement similaire aux enums Java meme si la mise en oeuvre de ce système est beaucoup plus lourde que ce qui est mis à disposition des développeurs Java.
Une fois de plus, le langage C# de Microsoft se montre sans limite...

Aucun commentaire:

Enregistrer un commentaire