Windows -Cloner un objet sans ICloneable
3 sept. 2015
En tant que nouveau développeur C#, on peut avoir le réflexe de faire
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!)
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
blog comments powered by Disqus
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);