我如何复制/克隆对象(引用类型)而不使用c#中的IClonable ?



我不希望逐个分配属性. 请不要说,我需要分配1乘1。我知道IClonable interface但不幸的是,假设Point类来自其他库,所以我不能修改。如何实现克隆属于其他库的对象?

在下面的例子中,正如预期的那样,当我们改变p2时,p1也会改变。我的目标是复制p1,当我改变复制对象时,我不希望主对象改变。在本例中,我希望p1保持原来的值。

public class Program
{
public static void Main()
{
Console.WriteLine("Hello World");
Point p1 = new Point(5,6);
Point p2= p1;
p2.X = 9;
Console.WriteLine("x={0}, y={1}", p1.X, p1.Y);
}
class Point 
{
// Constructor:
public Point(int x, int y)
{
X = x;
Y = y;
}
// Property implementation:
public int X { get; set; }
public int Y { get; set; }
}
}

您可以使用继承自System.ObjectMemberwiseClone方法:

public Point ShallowClone()
{
return (Point)this.MemberwiseClone();
}

ICloneable是接口,不是类。是否实现ICloneable对于逐个分配属性没有影响。


其他选项:

  • 如果您无法访问Point的代码或无法从中派生您的实现:
    • 使用AutoMapper NuGet包(或其他各种包之一)。
    • 创建扩展方法
  • 使类不可变。像这样,你可以像复制字符串一样复制引用。
  • 实现Point作为一个结构体。可以通过简单的赋值来复制结构。
  • 实现Point作为一个类或结构record,自动提供值行为(不变性,值相等)和更多。参见:Records (c#参考)。

我用automapper解决了这个问题。

你可以查看我的解决方案:

https://dotnetfiddle.net/En51IP(使用新方法)

https://dotnetfiddle.net/iapj84(旧方式)

最新更新