Search code examples
c#genericstypesconstructorclone

A constructor that takes object from same type


So I want to create constructor for my class EmployeeNodeClass that takes In EmployeeNodeClass object and copies it using a deepclone funtion:

public static T DeepClone<T>(T obj)
{
 using (var ms = new MemoryStream())
  {
    var formatter = new BinaryFormatter();
    formatter.Serialize(ms, obj);
    ms.Position = 0;

    return (T)formatter.Deserialize(ms);
 }
}

to the new object.

At first i thought that it is as simple as

 public EmployeeNodeClass(EmployeeNodeClass EMPND)
  {
   this = DeepClone(EMPND);
  }

but then I got the error that this is readonly.

so how can I do it?


Solution

  • It can be done using NewtonSoft JsonConvert.PopulateObject:

    Example:

    class Entity
    {
        public List<int> List { get; set; }
    
        public Entity(List<int> list)
        {
            List = list;
        }
    
        public Entity(Entity original)
        {
            string originalJson = JsonConvert.SerializeObject(original);
            JsonConvert.PopulateObject(originalJson, this);
        }
    }
    

    And using it:

    static void Main(string[] args)
        {
            var entity1 = new Entity(new List<int> { 1, 2, 3 });
            var entity2 = new Entity(entity1);
            entity1.List[0] = 5;
            Console.WriteLine(entity2.List[0]);
        }
    

    Note: since this uses NewtonSoft Json, it will only clone public, writable properties. So internal state in private fields (that are not associated with such properties) will be lost.