我不希望逐个分配属性. 请不要说,我需要分配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.Object
的MemberwiseClone
方法:
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(旧方式)