IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Deep Copy d'objets similaires


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Par défaut 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 : 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

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    Salut,

    Faire du linq et de la réflection est intéressant...
    Dans ce genre de problématique de recopie d'un objet, il est aussi possible d'utiliser la sérialization.

  3. #3
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Tu pourrais faire une sorte de liste d'équivalences. Avec évidemment int <=> int, DateTime <=> DateTime, ... mais aussi Namespace1.Tiers <=> Namespace2.Tiers, Namespace1.Adresse <=> Namespace2.Adresse, ...

    Et tu pourrais spécifier, pour chaque paire d'objets correspondant, soit de faire une copie "standard", avec le système de recopie que tu as présenté, ou une copie custom.

    C'est rigolo, j'ai aussi souvent ce problème : entre les objets sous forme de dataRow, ceux issus de telle ou telle source de donnée, les objets métiers, les objets d'UI, ... on se retrouver vite avec 15 classes représentant la même entité, et faire des méthodes conversions farcies de lignes du style bidule.Machin = truc.Machin

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Par défaut
    Tu peux regarder du coté de http://www.codeplex.com/AutoMapper

Discussions similaires

  1. Probleme copie d'objet dans un tableau
    Par ché dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 13/12/2006, 12h15
  2. [FLASH 8] Copy d'objets
    Par bibile dans le forum Flash
    Réponses: 3
    Dernier message: 13/09/2006, 17h18
  3. Méthode de classe et copie d'objets
    Par Duloup dans le forum Général Python
    Réponses: 5
    Dernier message: 11/04/2005, 16h27
  4. [VB6] Copie d'objet
    Par preverse dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 23/08/2004, 10h04
  5. [VB6] Copie d'objets
    Par austin49 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 19/05/2003, 18h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo