How do I create a copy of a class object without any reference? ICloneable
makes a copy of a class object (via shallow copy) but doesn't support deep copying. I am looking for a function that is smart enough to read all members of a class object and make a deep copy to another object without specifying member names.
Asked
Active
Viewed 1.3k times
6
-
2possible duplicate of [Clone Whole Object Graph](http://stackoverflow.com/questions/2417023/clone-whole-object-graph) – xanatos Oct 14 '11 at 13:39
-
1Quick and dirty solution is to serialize the object and immediately deserialize to another object. Of course that depends upon whether the object can be properly serialized... – canon Oct 14 '11 at 13:42
2 Answers
5
I've seen this as a solution, basically write your own function to do this since what you said about ICloneable not doing a deep copy
public static T DeepCopy(T other)
{
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, other);
ms.Position = 0;
return (T)formatter.Deserialize(ms);
}
}
I'm referencing this thread. copy a class, C#
0
public static object Clone(object obj)
{
object new_obj = Activator.CreateInstance(obj.GetType());
foreach (PropertyInfo pi in obj.GetType().GetProperties())
{
if (pi.CanRead && pi.CanWrite && pi.PropertyType.IsSerializable)
{
pi.SetValue(new_obj, pi.GetValue(obj, null), null);
}
}
return new_obj;
}
You can adjust to your needs. For example,
if (pi.CanRead && pi.CanWrite &&
(pi.PropertyType == typeof(string) ||
pi.PropertyType == typeof(int) ||
pi.PropertyType == typeof(bool))
)
{
pi.SetValue(new_obj, pi.GetValue(obj, null), null);
}
OR
if (pi.CanRead && pi.CanWrite &&
(pi.PropertyType.IsEnum || pi.PropertyType.IsArray))
{
...;
}

ADM-IT
- 3,719
- 1
- 25
- 26