Methode clonage 'deepclonage'

Description

MemberwiseClone est pratique, certes, mais elle ne duplique pas les propriétés et fields de type reference : l'objet cloné pointe sur les mêmes objets...
Il est bien sur de définir la méthode Clone pour chacun des 'enfant', et les appeler les uns après les autres.
seulement, si vous ajouter un champs, il faudra penser a modifier en conséquence votre méthode Clone...

je vous propose donc cette classe, a utiliser en tant que classe de base de vos classes à cloner.
Celle-ci implémente la méthode Clone, et parcoure un à un les fields et properties qu'elle contient, et clone le tout.
(Les IEnumerables ne sont pas pris en compte, je pourrais modifier mon code, au besoin)

Source / Exemple :


using System;
using System.Reflection;

public abstract class CDeepCloner : ICloneable
{
    private object Clone(object vObj)
    {
        if (vObj.GetType().IsValueType || vObj.GetType() == Type.GetType("System.String"))
            return vObj;
        else
        {
            object newObject = Activator.CreateInstance(vObj.GetType());

            foreach (PropertyInfo Item in newObject.GetType().GetProperties())
            {
                if (Item.GetType().GetInterface("ICloneable") != null)
                {
                    ICloneable IClone = (ICloneable)Item.GetValue(vObj, null);
                    Item.SetValue(newObject, IClone.Clone(), null);
                }
                else
                    Item.SetValue(newObject, Clone(Item.GetValue(vObj, null)), null);
            }

            foreach (FieldInfo Item in newObject.GetType().GetFields())
            {
                if (Item.GetType().GetInterface("ICloneable") != null)
                {
                    ICloneable IClone = (ICloneable)Item.GetValue(vObj);
                    Item.SetValue(newObject, IClone.Clone());
                }
                else
                    Item.SetValue(newObject, Clone(Item.GetValue(vObj)));
            }
            return newObject;
        }
    }

    public object Clone()
    {
        return Clone(this);
    }
}

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.