【问题标题】:A constructor that takes object from same type从相同类型获取对象的构造函数
【发布时间】:2020-01-29 23:22:34
【问题描述】:

所以我想为我的类 EmployeeNodeClass 创建一个构造函数,它接受 EmployeeNodeClass 对象并使用 deepclone 函数复制它:

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 是只读的错误。

那我该怎么做呢?

【问题讨论】:

  • 如果你的类型有引用类型成员,那么不会保证深度克隆。
  • ThisEmployee 成员的声明是什么?
  • @OlivierRogier 对不起,错误的构造函数。编辑它
  • @AvivVetaro .Net 中内置了 nothing 来保证复杂类型的简单深层克隆。您必须知道您的类型并复制这些字段。 IClonable 是为了帮助解决这个问题,但在实践中失败了。
  • 不要使用构造函数。创建一个返回 T 的静态方法。

标签: c# generics types constructor clone


【解决方案1】:

可以使用 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,它只会克隆公共的、可写的属性。因此私有字段(与此类属性无关)中的内部状态将丢失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 2013-02-17
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多