Introduction of 4 deep copy methods in C

  • 2021-06-29 11:51:33
  • OfStack

1: Using reflection


public static T DeepCopy<T>(T obj)
{
  // Return directly if it is a string or value type 
  if (obj is string || obj.GetType().IsValueType) return obj;

  object retval = Activator.CreateInstance(obj.GetType());
  FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
  foreach (FieldInfo field in fields)
  {
    try { field.SetValue(retval, DeepCopy(field.GetValue(obj))); }
    catch { }
  }
  return (T)retval;
}

2: Using xml serialization and deserialization


public T DeepCopy<T>(T obj)
    {
      object retval;
      using (MemoryStream ms = new MemoryStream())
      {
        XmlSerializer xml = new XmlSerializer(typeof(T));
        xml.Serialize(ms, obj);
        ms.Seek(0, SeekOrigin.Begin);
        retval = xml.Deserialize(ms);
        ms.Close();
      }
      return (T)retval;
    }

3: Using binary serialization and deserialization


public static T DeepCopy<T>(T obj)
{
  object retval;
  using (MemoryStream ms = new MemoryStream())
  {
    BinaryFormatter bf = new BinaryFormatter();
    // Serialization into stream 
    bf.Serialize(ms, obj);
    ms.Seek(0, SeekOrigin.Begin);
    // Deserialize to Object 
    retval = bf.Deserialize(ms);
    ms.Close();
  }
  return (T)retval;
}

4: Implemented using silverlight DataContractSerializer for use in silverlight clients


public static T DeepCopy<T>(T obj)
    {
      object retval;
      using (MemoryStream ms = new MemoryStream())
      {
        DataContractSerializer ser = new DataContractSerializer(typeof(T));
        ser.WriteObject(ms, obj);
        ms.Seek(0, SeekOrigin.Begin);
        retval = ser.ReadObject(ms);
        ms.Close();
      }
      return (T)retval;

Supplement: The first one has been made deep copy recursively.


Related articles: