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.