Deep Copy d'objets similaires
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:
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:
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 :oops: