Cloner un Objet sans utiliser son Type...

Signaler
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007
-
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007
-
Salut à tous, j'ai un objet et je cherche à faire une copie par valeur de ce dernier (le cloner)
Comment puis-je faire étant donné que la classe object n'a pas de méthode clone et qu'il est impossible de construire un objet en passant une valeur dans son constructeur...
Merci d'avance pour votre aide..

PS: j'ai essayé de me pencher sur les liaison tardive avec system.reflection mais je cherche une solution qui m'évitera de tester tout les types possibles que l'objet peut prendre...

9 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Je comprends pas bien.. tu parles d'un objet ou d'un objet le type Object !?

La classe Object possède uniquement des méthodes, y a rien à cloner. ??

La classe Object a une méthode MemberwiseClone très pratique pour la copie supercfielle des classes dérivées.
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
21
Implementer l'interface Iclonable ne te suffit pas ?

::|The S@ib|:: MVP C#.NET
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007

Bien en fait j'ai un objet qui peut être de plusieur type différent et j'aimerai faire une copie complete de cet élément sans avoir à connaitre son type de tel sorte que :

object monObj = new object();
monObj = (object) monBateau;

object maSauvegarde = new object();

si je fait maSauvegarde = monObj c'est une copie partielle qui ne redirige que le pointeur et je ne peut pas faire maSauvegarde = new object(monObj) car celà n'existe pas... alors comment faire pour faire une copie complete d'un objet sans avoir repasser par le type de l'objet...?
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007

monBateau hérite de CompositeControl mais pas de IClonable ... est ce possible de le faire hériter des deux ?
Si non il n'y a aucune solution ?
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Tu peux heriter d'autant d'interface que tu veux même si tu herites déja d'un classe.

public class DerivedClass : BaseClass, IClonable { .. }
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007

et est il possible de créer l'héritage apres l'instanciation de l'objet ?
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007

J'ai trouvé une source VB qui passait par une conversion au format bin et une serialisation puis une deserialisation dans l'objet clone mais ça ne marche pas car la classe dérivée ControlComposite ne peut pas être serialisée...

Là je ne vois vraiment plus comment faire, j'ai fait un using de system.Reflection et je cherche à trouver une solution avec Activator.CreateInstance(montype) mais j'arrive au même problème car je ne c pas comment, une foi l'instance créée, faire une copie complete de mon objet...

PS: pour la dérivation avec IClonable celà pausera le problème des objets imbriqués dans monObjet de toute façon ?
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
La méthode Clone c'est toi qui va la créer donc dedans tu feras une nouvelle allocation pour les membres de types référence, par exemple pour une chaine, faut allouer une nouvelle chaine et pas seulement copier la référence.

Je crois que Maintenant Microsoft préconise d'utiliser un constructeur de copie, mais ça colle pas pour ce que tu veux faire.
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007

Oui j'y est pensé mais je ne sait pas faire de constructeur de copie pour les types d'objet que j'ai...

Alors sinon g trouvé cette source très très intéressante qui utilise la Reflection :
http://www.csharpfr.com/codes/METHODE-CLONAGE-DEEPCLONAGE_34850.aspx

Je suis en train d'essayer de reprendre l'algoritme pour en faire une fonction autonome (car comme je le disait mes classes héritent déjà d'une autre classe)

Là ça ne marche pas et le message d'erreur est "no parameterless constructor defined for this object"
La source de l'erreur est le rappel de la fonction à la ligne :


Item.SetValue(newObject, Clone(Item.GetValue(vObj, null)), null);



Si je ne trouve pas j'enverai un mail à l'auteur du code...

Merci pour ton aide Lutinore