【问题标题】:Make Copy of Object Without Reference To Original [duplicate]在不参考原始对象的情况下复制对象[重复]
【发布时间】:2018-08-22 21:40:38
【问题描述】:

我有一个函数,它从列表中获取一个对象作为参数。我创建了这个对象的一个​​新实例,并使其与传递给函数的对象相等。我更改了新对象的一些属性,但这些更改也适用于列表中的原始对象。示例:

public void myFunction(Object original)
{
    var copyOfObject = original;

    copyOfObject.SomeProperty = 'a';
}

从阅读中,我想我正在创建原始对象的浅表副本,所以当我更新新对象的属性时,这会导致原始对象的属性更改为?我已经看到了一些复制整个对象列表以创建深层副本的示例,但我只想创建这个单个对象的深层副本,而不是整个列表。我可以不用这样做吗:

  copyOfObject = new Object();
  copyOfObject.someProperty = original.someProperty;

在进行更改之前?

【问题讨论】:

  • 最好使用复制构造函数,这将在您的控制范围内。
  • 确实,闻起来像关门
  • 您可以序列化和反序列化您的对象。您将获得另一个对象或实现 Iclonable 接口并使用 Clone 方法。
  • @BuddhabhushanKamble ,序列化和反序列化确实有自己的开销。当您有更好的方法来实现相同的目的时,承担这笔开销会有多大的成效总是值得商榷

标签: c#


【解决方案1】:

您可以对对象应用序列化反序列化来创建深拷贝。

public static class ObjectExtensions
{
    public static T Clone<T>(this T obj)
    {
        return (T)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(obj));
    }
}

然后使用;

public void myFunction(Object original)
{
    var copyOfObject = original.Clone();
}

【讨论】:

  • using Newtonsoft.Json;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 2023-04-08
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多