Après-midi reflection !

oct 23, 2012 3:45 pm by Julien

En cette après midi si ensoleillée à Rennes(ironie quand tu nous tiens …), je me suis posé la question : Que faire ?
Je me suis dit pourquoi pas faire un “truc” qui permettrait de faire la translation xml <-> entités.
Alors je pense que ça doit surement exister, je vous avoue que j’ai pas cherché et que je voulais juste m’occuper
Je suis parti du fait que généralement quand on récupére un xml on nomme nos propriètes du même nom que l’élément XML.
Donc la contrainte qu’on a c’est :

  • Les proprietés de l’objet doivent avoir le même nom que les éléments du XML

Un exemple :

Pour un élément XML de ce type :

<lines> 
   <name>61</name>
   <picto>LS61.png</picto>
</lines>

On doit avoir une classe qui ressemble à ça :

public class Line
{
        public string Name { get; set; }
        public string Picto { get; set; }
}

Ce qu’on a à faire, c’est parser notre XML pour récupérer chaque élément “Lines” et appeler une méthode qui créera l’entité.

On va faire tout cela grâce à de la réflection. Un exemple sera plus parlant qu’un long discours !

 1: public static IList<T> XmlMaterializer<T>(string strXml, string node) 
 2:     where T : class, new()
 3: {
 4:     var xml = XElement.Parse(strXml);
 5:     var lstEntities = (xml.Descendants(node)
 6:                         .Select(x => EntityCreation<T>(x))).ToList();
 7:     return lstEntities;
 8: }

 

Pour commenter le bout de code, on parse le fichier xml, et ensuite avec un peu Linq, on récupére chaques éléments correspondant à notre noeud qu’on passe à une méthode qui sera charger de créer notre entité.

 1: private static T EntityCreation<T>(XElement item) where T : class, new()
 2: {
 3:     var typeOfT = typeof (T);
 4:     T entity = new T();
 5:     foreach (var attr in typeOfT.GetProperties())
 6:     {
 7:         attr.SetValue(entity, item.Element(attr.Name.ToLowerInvariant()).Value, null);
 8:     }
 9:     return entity;
 10: }

C’est ici que ca devient inéteressant, on va récuperer le type de l’entité que l’on veut créer puis 0 l’aide d’une boucle on va affecter les propriétés correspondantes !Le bout de code est pas dur à comprendre. Il fonctionne que pour les type string mais rien nous empêche de faire des vérifications avant l’affectation et d’appliquer la conversion 

Pour utiliser notre helper on a juste à appeler la méthode de cette façon:

 1: var toto = XmlHelper.XmlMaterializer<Line>(xml, "lines");


Et on obtient une Liste de toutes nos “Lines” !

Donc tout ça au final pour dire que la reflection c’est vachement puissant mais ça tout le monde le savait déjà

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading