1: Using Reflection to achieve
public static T deepcopy<t> (T obj) { //If it is a string or value type, it returns the 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 implementations
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 implementations
public static T deepcopy<t> (T obj) { object retval; using (MemoryStream ms = new MemoryStream ()) { BinaryFormatter bf = new BinaryFormatter (); Serialized into Stream BF. Serialize (MS, obj); Ms. Seek (0, seekorigin.begin); Deserializes into object retval = bf. Deserialize (MS); Ms. Close (); } Return (T) retval;}
4: Implemented with 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;
Add: The first one has been implemented by recursive deep copy.