using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
public static object DeepCopy(object obj)
Type type = obj.GetType();
if (type.IsValueType || type == typeof(string))
Type elementType = type.GetElementType();
var array = obj as Array;
Array copied = Array.CreateInstance(elementType, array.Length);
for (int i = 0; i < array.Length; i++)
copied.SetValue(DeepCopy(array.GetValue(i)), i);
return Convert.ChangeType(copied, obj.GetType());
object toret = Activator.CreateInstance(obj.GetType());
FieldInfo[] fields = type.GetFields(BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo field in fields)
object fieldValue = field.GetValue(obj);
field.SetValue(toret, DeepCopy(fieldValue));
throw new ArgumentException("Unknown type");
public virtual void Print()
Console.WriteLine("A " + str);
public A GetNewInstance()
return DeepCopy(this) as A;
public B() { str = "B"; }
public override void Print()
Console.WriteLine("B " + str);
public static void Main()
var clone = obj.GetNewInstance();