2016-03-08 88 views
1

這只是一個'出於好奇'的問題,所以我不能提供一個基於當前問題的真實世界示例,但是有一些虛擬代碼應該足夠了。我想知道的是,如果有一種直接(並且特別快速)的方式將對象的實例映射到'this'(當前實例的類型完全相同,可以訪問私有成員等)將對象實例映射到'this'?

public class MyObject { 
    public MyObject(MyObject other) { 
     // of course, won't work 
     this = other; 
    } 
} 

我見過的所有示例和操作方法都是過度使用反射,甚至構建完整的表達式樹或使用像Automapper這樣的框架,當想法看起來「相當平凡」時,它們都有自己的侷限性。爲什麼不可能將所有指針/引用等從內存中的某個位置複製到另一個位置,因爲分配的空間等是完全相同的?

+0

您可以使用ISerializable –

+0

克隆它因爲「複製」是一個比您假設的更復雜的複雜過程。假設類有一個List類型的字段。你是否複製引用,或者你是否創建了一個新列表並將其中的元素複製到它中?如果你使用後者,你是複製項目引用還是需要複製項目對象?他們的領域應該發生什麼?如果您沒有足夠的訪問權限來做到這一點,該怎麼辦?試着用語言解決這個問題,你會得到一個C++ frankenlanguage。 –

回答

1

AFAIK,沒有一個簡單的方法來爲自己的實例(this)做這件事。我想,將其他實例的數據複製到此就足夠了。對你來說可能的替代方案是使用靜態實例,但如果你需要使用多於一個實例的話,這會有一些特殊之處。 PS:我從我的手機寫了這篇文章,所以如果遇到小錯誤,請原諒我,因爲在發佈之前我無法測試它。一旦我能夠測試代碼,我會盡快更新該帖子。

1

如果這是可能的,那麼您只需通過引用other即可,但不能將其內容複製到MyObject的新實例。所以你的構造函數只會返回一個新的引用到已經存在的實例。你需要的是一個全新的MyObject實例,不是嗎?所以你必須使用其構造函數創建一個。如果你有一個拷貝構造函數,達到這個you're罰款:

public class MyObject { 
    public MyObject(MyObject other) { 
     this.Prop1 = other.Prop1; 
    } 
} 

當然也有一些較短的(但不是neccesarily金丹)appraoches - 例如使用反射並簡單地將所有屬性值從一個實例複製到另一個實例。但基本上,您最終還是會通過適當地設置其成員來創建一個全新的實例。

反射代碼可能類似於此:

public class MyObject { 
    public MyObject(MyObject other) { 
     var props = typeof(MyObject).GetProperties(); 
     foreach(var p in props) 
     { 
      p.SetValue(this, p.GetValue(other)); 
     } 
    } 
} 

然而,這僅適用於公共屬性,你有領域和私有或內部成員也這樣做。

+0

如果我需要一個全新的實例取決於用例,我想。假設我有一個基於強制類型配置模型的配置系統,它正在從底層提供者/序列化器反序列化。然後我希望序列化程序返回的實例實際上是當前實例。然而對於例如DTO/PTO映射等,我期望實例被複制。 – artganify

+0

因此,如果您已經有了對您的實例的引用,並且不想要它的副本,那麼爲什麼不直接使用該引用呢? – HimBromBeere