Votre navigateur n'est pas à jour !

Merci de mettre à jour votre navigateur pour utiliser mon blog. Mettre à jour mon navigateur maintenant

×

Windows - Cloner un objet sans ICloneable

Date de publication 3 sept. 2015
En tant que nouveau développeur C#, on peut avoir le réflexe de faire

ObjectType myNewObject = myOldObject;

Or ce code fait une copie par référence et non par valeur.
En effet en modifiant une propriété de myNewObject, cette même propriété dans myOldObject sera modifiée.

Ce que je cherchais à faire était de copier tout mon objet pour changer une seule propriété.

Avec ICloneable super facile, mais ma librairie qui contient la classe à dupliquer partage des objets entre plusieurs applications donc il n'est pas envisageable de la modifier pour étendre l'interface ICloneable.

Je n'ai pas trouvé de solution sur le web mais un collègue, petit génie .Net, m'a proposé la solution suivante (et qui fonctionne en plus!)
public static T Clone<T>(T obj)
   {
     DataContractSerializer dataContractSerializer = new DataContractSerializer(obj.GetType());

     MemoryStream memoryStream = new MemoryStream();

     dataContractSerializer.WriteObject(memoryStream, obj);

     memoryStream.Position = 0;

     T newObject = (T)dataContractSerializer.ReadObject(memoryStream);

     return newObject;
}

On place notre objet sérialisé dans un stream, qui va placer le tout dans un nouvelle espace mémoire donc une nouvelle référence. Et hop ma copie est opérationnelle comme cela

ObjectType myNewObject Clone(myOldObject);
blog comments powered by Disqus