La problématique schématisée :
Copier un objet Tiers issu d’une Fonctionnalité particulière, décrit ci-dessous, et l’adapter vers un objet Tiers commun à plusieurs Fonctionnalités et qui comporte donc des attributs communs.
Fonctionnalité1.Tiers :
- string Nom
- string Prenom
- Fonctionnalité1.Adresse adresse
- List<Fonctionnalité1.Contact> contacts
Fonctionnalité1.Adresse :
- string Rue
- string CodePostal
- string Ville
Structure.Tiers :
- string Nom
- string Prenom
- DateTime DateEntreeBanque
- Structure.Adresse adresse
- List<Structure.Contact> contacts
Structure.Adresse :
- string Rue
- string CodePostal
- string Ville
La méthode Copier ci-dessous explore les propriétés des objets de type T et U et met en commun les propriétés « communes » (même type et même nom).
Ce qui fonctionne bien pour les types simples (string, DateTime, …) mais par pour un type Adresse, par exemple, puisqu’il n’y a pas de moyen de copier un type fonctionnalité.Adresse vers un type Structure.Adresse
1. Comment introduire une récursivité pour explorer le sous-objet de type Adresse au moment de faire le SetValue ??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 /// <summary> /// Copie les propriétés du type U à partir des propriétés commune au type T /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="U"></typeparam> /// <param name="sender"></param> /// <param name="retour"></param> public static void Copier<T, U>(this T sender, U retour) { var req = ( // Selection des properties de l'objet original from s in typeof(T).GetProperties() // Selection des properties de l'objet de retour from r in typeof(U).GetProperties() // Jointure des properties where r.Name == s.Name && r.PropertyType == s.PropertyType select new { r, s }) .ToArray(); // Test si on a bien des données if (req != null && req.Length > 0) { for (Int32 i = 0; i < req.Length; i++) { // Test si un accesseur a été défini if (req[i].r.GetSetMethod() != null) { req[i].r.SetValue( retour, req[i].s.GetValue(sender, null), null); } } } }
2. Enfin, que faire avec l’attribut contacts qui est une List<> ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if (req[i].r.GetType().IsClass) { Et ensuite ? }
Merci à tous pour votre aide![]()
Partager