Copie complète d'un objet en C#
jeudi 31 octobre 2013 à 10:30En C#, il peut nous arriver d'avoir à copier complètement un objet, et non pas juste la référence à cet objet. Si c'est assez simple dans de nombreux cas (utiliser .Clone() sur chacun de ses attributs), ça peut devenir galère si notre objet contient plusieurs sous-objets, ou si notre objet a énormément de propriétés.
Il existe, heureusement, une solution très simple : utiliser la sérialisation binaire pour cloner notre objet.
public static T DeepClone<T>(T obj) where T : ISerializable { using (var ms = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(ms, obj); ms.Position = 0; return (T)formatter.Deserialize(ms); } }
Seule contrainte : notre objet doit-être sérialisable (il suffit pour cela de mettre [Serializable] au dessus de vos classes à cloner). Mais cette simple méthode de quatre lignes nous évitera d'avoir à faire des .Clone sur chacune des propriétés de notre objet !
Et on peut aller encore plus loin, grâce aux méthodes d'extensions :
public static class ExtensionMethods { public static T DeepClone<T>(this T obj) where T : ISerializable { using (MemoryStream stream = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, obj); stream.Position = 0; return (T)formatter.Deserialize(stream); } } }
Grâce à ce petit morceau de code, vous pouvez désormais cloner n'importe quel objet sérialisable en utilisant .DeepClone(). Pratique non ?
Bon, inutile de vous rappeler que Cloner vos objets est une mauvaise idée (performances, mémoire, tout ça...). Mais lorsqu'on n'a pas le choix, ce code est vraiment pratique.
Bon dev à tous !