我想向System.Drawing.RectangleF
類添加額外的複製構造函數,該構造函數需要另一個RectangleF
作爲其唯一參數。將構造函數添加到C#系統類
我試着在System.Drawing命名空間中創建一個部分類,它給了我一個命名空間衝突。我嘗試使用擴展類來實現它,並且不會將其視爲構造函數。
我想向System.Drawing.RectangleF
類添加額外的複製構造函數,該構造函數需要另一個RectangleF
作爲其唯一參數。將構造函數添加到C#系統類
我試着在System.Drawing命名空間中創建一個部分類,它給了我一個命名空間衝突。我嘗試使用擴展類來實現它,並且不會將其視爲構造函數。
在RectangleF
的情況下,你沒有真正做任何事情,因爲RectangleF
是結構,因此它具有值語義。將Rect分配給變量會複製其內容。
看看下面的示例代碼:
RectangleF a = new RectangleF(1, 2, 3, 4);
Console.WriteLine(a);
RectangleF b = a; //a gets copied to b
Console.WriteLine(b);
a.X = 5;
a.Y = 6;
a.Width = 7;
a.Height = 8;
Console.WriteLine(a);
Console.WriteLine(b);
當你運行它,你會得到下面的輸出:
{X=1,Y=2,Width=3,Height=4}
{X=1,Y=2,Width=3,Height=4}
{X=5,Y=6,Width=7,Height=8}
{X=1,Y=2,Width=3,Height=4}
你可以看到的值複製到b,然後在修改a時b保持不變。如果RectangleF
是一個實際的類,它將具有引用語義,最後兩行輸出將是相同的東西。
我想你只能使用部分類功能,如果你有效擁有這個類。那就是你不能像這裏的情況那樣在另一個DLL中部分一個類。
RectangleF是一個結構,順便說一句,不是一個類,不是說這真的改變了任何東西。您可能會看到extension methods;你將無法定義構造函數,但你可以定義一個擴展方法,讓你這樣做的:
var newRectangleF = existingRectangleF.clone();
擴展方法可以跨DLL邊界限定,並且可以調用使用實例方法語法或靜態方法句法。它們與Visual Studio很好地配合,比如完成建議。
您還可能會發現MemberwiseClone()
有趣。
只有當你不需要訪問類的內部時,擴展方法纔會起作用,除非你打算調用一些反射魔法。 –
我並不需要訪問內部實體,我打算只接受傳入的'RectangleF'並將'.Location'和'.Size'傳遞給內置的構造函數。 – JKreft
我將此標記爲答案,因爲它確實解決了我的具體問題。然而,當我嘗試擴展內置類並想添加新構造函數時,知道是否有一個通用解決方案會很好。 – JKreft
@JKreft:答案很簡單:不可能。 – whatsisname