Blog de JP Gouigoux

25/05/2008

Retrouver une valeur d’énumération depuis son libellé par réflexion

Filed under: .NET — jpgouigoux @ 8:14
Tags:
public enum ModeTraitement : byte { COMPLET = 0, MIXTE = 1, REDUIT = 2 };
<ActionPreventive ModeTraitement="COMPLET">

Imaginez que vous devez mettre en place une désérialisation à la main depuis un fichier XML, parce que la classe ne correspond pas à ce dont vous disposez. Il est plus simple de parcourir ledit fichier et, pour chaque élément, créer par réflexion l’instance de classe correspondante, puis faire de même pour les attributs. Dans le cas de type simple, pas de problème.

Mais souvent, quand les fichiers XML doivent être facilement lisible, vous ne disposez pas pour un attribut correspondant à un type énuméré de sa valeur entière, mais plutôt du libellé associé.

Par exemple :

Bref, pas de chance, car vous ne pouvez pas affecter directement la valeur par réflexion sur la propriété avec le genre de code ci-dessous :

PropertyInfo Propriete = TypeActivite.GetProperty(Attribute.LocalName);
Propriete.SetValue(ActionPreventive, "COMPLET", null);

Vous aurez une erreur car le type doit être byte, et non pas string tel que vous tentez de le faire.

La solution : parcourir par réflexion les valeurs possibles de l’énumération. Le principe paraît simple, mais je fais quand même un petit billet là-dessus, parce que j’ai mis un peu de temps à trouver.

PropertyInfo Propriete = TypeActionPreventive.GetProperty("ModeTraitement");
if (Propriete.PropertyType.IsEnum)
{
 foreach (FieldInfo AtomeEnum in Propriete.PropertyType.GetFields(BindingFlags.Public | BindingFlags.Static))
 if (AtomeEnum.Name.Equals("COMPLET"))
 {
  Propriete.SetValue(ActionPreventive, (byte)AtomeEnum.GetValue(null), null);
  break;
 }
}

En espérant que ça serve à quelqu’un.

Laisser un commentaire »

Aucun commentaire pour l’instant.

RSS feed for comments on this post. TrackBack URI

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

Créez un site Web ou un blog gratuitement sur WordPress.com.

%d blogueurs aiment cette page :