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 :

[deepCopy] copie les elements d'un tableau


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut [deepCopy] copie les elements d'un tableau
    Voilà.

    j essaye de faire une DeepCopy (par reflexion) d'une classe qui possède un tableau multidimensionel de type générique.
    Déclarer ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected T[,] m_Array;
    Le problème c est que ma methode copie la reference du tableau :-( et non la valeur des elements à l'interieure.

    Pourriez vous m'aider a corriger ma methode de copie ?
    merci.

    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
    private static object Clone(object vObj)
            {
                if (vObj.GetType().IsValueType || vObj.GetType() == Type.GetType("System.String"))
                    return vObj;
                else
                {
                    object newObject = Activator.CreateInstance(vObj.GetType());
     
                    //copy all fields
                    foreach (FieldInfo Item in newObject.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public))
                    {
                        if (Item.GetValue(vObj) != null)
                        {
                            if (Item.GetType().GetInterface("ICloneable") != null)
                            {
                                ICloneable IClone = (ICloneable)Item.GetValue(vObj);
                                Item.SetValue(newObject, IClone.Clone());
                            }                        
                            else
                                Item.SetValueD(newObject, Item.GetValue(vObj));
                                //Item.SetValue(newObject, Clone(Item.GetValue(vObj)));
                        }
                    }
                    return newObject;
                }
            }

  2. #2
    Membre émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Par défaut
    Bonsoir,

    Citation Envoyé par ZaaN Voir le message
    Voilà.
    Le problème c est que ma methode copie la reference du tableau :-( et non la valeur des elements à l'interieure.
    Normal, un tableau est un type référence. La méthode Clone implémentée par l'interface ICloneable est définie en tant que méthode d'instance, pourquoi utiliser une méthode statique ?

    Le contenu de la méthode dépend des champs de la classe qui implémente la méthode, c'est une méthode spécifique.

    Il faut que tu vérifie si l'objet que tu fais passer en argument de la méthode est un type référence ou un type valeur:

    Dans l'exemple suivant, tu as 2 instances de classe de type ExampleClass.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ExampleClasse classe1 = new ExampleClasse();
    ExampleClasse classe2 = classe1;
    Je réalise un assignation entre l'objet classe1 et classe2, ce qui aura pour conséquence que les 2 objet pointeront vers la même adresse mémoire.

    Pour créér une copie entre 2 objets de type référence, il faut instancier un nouvel objet, copier les propriétés d'un objet à l'autre (si le champ de l'objet est de type référence, il faudra aussi instancier un nouvel objet de même type du champ sinon on réalise un copie superficielle).

    Dans le cas de ton tableau, il faut créé un nouveau tableau et copier le contenu du tableau source dans le tableau de destination.

    La méthode Clone a failli devenir obsolète car elle ne définit par par défaut si la copie sera superficielle ou une copie en profondeur. Tu peux utiliser la solution de Patrick Smacchia en utilisant un constructeur de copie qui prendre en paramètre un boulet qui précisera si la copie que tu veux faire sera une copie en profondeur ou une copie superficielle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/10/2009, 10h24
  2. Copier les element d'un tableau à 2 dimensions
    Par enibris dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 03/03/2009, 00h07
  3. afficher les elements d'un tableau dans select
    Par koukoya dans le forum Struts 1
    Réponses: 6
    Dernier message: 19/05/2008, 18h44
  4. [Tableaux] regrouper les elements d'un tableau
    Par ericmart dans le forum Langage
    Réponses: 3
    Dernier message: 23/06/2006, 09h35
  5. Faire défiler les elements d'un tableau
    Par Laure888 dans le forum Flash
    Réponses: 2
    Dernier message: 12/10/2005, 16h00

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