Я считаю, что самый простой способ клонирования - использовать сериализацию. Это, очевидно, работает только с классами [Serializable]
или реализующими ISerializable
.
Вот общее универсальное расширение, которое можно использовать для клонирования объектов любого сериализуемого класса:
public static T Clone<T>(this T source)
{
if (source == default(T))
{
return default(T);
} else {
IFormatter formatter = new BinaryFormatter();
Stream ms = new MemoryStream();
using (ms)
{
formatter.Serialize(ms, source);
stream.Seek(0, SeekOrigin.Begin);
return (T) formatter.Deserialize(ms);
}
}
}