Publié
mercredi 29 octobre 2008 21:34
par
Luke77
Je fait suite aux articles précédants avec ce nouvel opus qui concernent le mapping à proprement parlé. Afin d'expliquer plus clairement le moyen d'y parvenir, il est plus prudent de commencer par une méthode relativement simple : par réflection.
Cela se résume à une méthode et une seule que voici :
1: public override long Map(E entity, SqlDataReader reader)
2: { 3: long bitMap = 0;
4:
5: for (int i = 0; i < reader.FieldCount; i++)
6: { 7: string columName = reader.GetName(i);
8: FieldMapped fieldMapped = null;
9:
10: if (_specificMapping.TryGetValue(columName, out fieldMapped))
11: { 12: if (fieldMapped.Field != null)
13: { 14: if (reader[ i ] is DBNull)
15: { 16: fieldMapped.Field.SetValue(entity, null);
17: }
18: else
19: { 20: fieldMapped.Field.SetValue(entity, MappingHelper.ConvertTo(fieldMapped.Field.FieldType, reader[ i ]));
21: }
22: }
23: else
24: { 25: if (reader[ i ] is DBNull)
26: { 27: fieldMapped.Property.SetValue(entity, null, null);
28: }
29: else
30: { 31: fieldMapped.Property.SetValue(entity, MappingHelper.ConvertTo(fieldMapped.Property.PropertyType, reader[ i ]), null);
32: }
33: }
34: bitMap |= fieldMapped.MappingAttribute.BitFieldIndex;
35: }
36: }
37:
38: return bitMap;
39: }
Qu'est-ce que l'on fait ici ? Pour chacune des colonnes du DataReader, on vérifie si le nom de la colonne est présent dans les mapping que l'on découvert grâce au code précédant. Si c'est le cas, on affecte la valeur trouvée au Field ou Property. La valeur est convertie grâce à une petite classe que je ne détaillerai pas ici mais qui se contente de faire des ConvertTo ou des cast.
Dernière petite chose, le bitmap est mis à jour en fonction des champs que l'on aura réussi à mapper :-)
Bon, c'était easy comme tout, prochain article on fait la même chose mais avec de l'IL généré dynamiquement.
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 :