Alors que la norme est de mettre en œuvre l' ICloneable
(interface décrite ici, donc je ne vais pas régurgiter), voilà une belle profondeur cloner un objet copieur j'ai trouvé sur Le Projet de Code il y a un moment et l'a incorporé dans nos affaires.
Comme mentionné ailleurs, il n'a besoin de vos objets sérialisables.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
/// <summary>
/// Reference Article http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx
/// Provides a method for performing a deep copy of an object.
/// Binary Serialization is used to perform the copy.
/// </summary>
public static class ObjectCopier
{
/// <summary>
/// Perform a deep Copy of the object.
/// </summary>
/// <typeparam name="T">The type of object being copied.</typeparam>
/// <param name="source">The object instance to copy.</param>
/// <returns>The copied object.</returns>
public static T Clone<T>(T source)
{
if (!typeof(T).IsSerializable)
{
throw new ArgumentException("The type must be serializable.", "source");
}
// Don't serialize a null object, simply return the default for that object
if (Object.ReferenceEquals(source, null))
{
return default(T);
}
IFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream();
using (stream)
{
formatter.Serialize(stream, source);
stream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(stream);
}
}
}
L'idée est qu'il sérialise votre objet, puis désérialise dans une nouvelle objet. L'avantage est que vous n'avez pas à vous soucier à propos du clonage tout quand un objet devient trop complexe.
Et avec l'utilisation de méthodes d'extension (également à partir de l'origine référencé source):
Dans le cas où vous préférez utiliser les nouvelles méthodes d'extension de C# 3.0, changer la méthode pour avoir la signature suivante:
public static T Clone<T>(this T source)
{
//...
}
Maintenant, l'appel de la méthode devient tout simplement objectBeingCloned.Clone();
.