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

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);
             }
         }
     }
}
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
if (req[i].r.GetType().IsClass)
{
    Et ensuite ?
}
2. Enfin, que faire avec l’attribut contacts qui est une List<> ?

Merci à tous pour votre aide