Конструктор, который берет объект из того же типа - PullRequest
1 голос
/ 30 сентября 2019

Итак, я хочу создать конструктор для моего класса EmployeeNodeClass, который принимает объект In EmployeeNodeClass и копирует его с помощью функции глубокого клона:

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);
 }
}

в новый объект.

Сначала я подумал, что это так же просто, как

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

, но потом я получил ошибку, что this только для чтения.

так как я могу это сделать?

1 Ответ

2 голосов
/ 30 сентября 2019

Это можно сделать, используя NewtonSoft JsonConvert.PopulateObject:

Пример:

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);
    }
}

И используя его:

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]);
    }

Примечание: поскольку для этого используется NewtonSoft Json, он будет клонировать только общедоступные, доступные для записи свойства. Таким образом, внутреннее состояние в закрытых полях (которые не связаны с такими свойствами) будет потеряно.

...