簡體   English   中英

如何在不使用 C# 中的 IClonable 的情況下復制/克隆對象(引用類型)?

[英]How can I copy/clone objects(reference type) without using IClonable in C#?

我不想一一分配屬性 請不要說,我需要 1 1 分配。我知道IClonable 接口但不幸的是,假設 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 請參閱: 記錄(C# 參考)

我使用 automapper 解決了這個問題。

您可以查看我的解決方案:

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

https://dotnetfiddle.net/iapj84 (使用舊方法)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM