PROJET AUTOBLOG


HowTommy

source: HowTommy

⇐ retour index

Mise à jour

Mise à jour de la base de données, veuillez patienter...

Copie complète d'un objet en C#

jeudi 31 octobre 2013 à 10:30
Clavier

En 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 !