2011-09-09 211 views
0

我正在寫一個簡單的映射器類來克隆和複製不同對象之間的不同/相同類型的屬性。對象映射到位圖

映射是通過反射執行的,對於值類型,列表和引用類型來說工作得很好。

一切工作的類型像這樣的:

class SimpleValueTypes 
{ 
    public string Name { get; set; } 
    public int Number { get; set; } 
    public long LongNumber { get; set; } 
    public float FloatNumber { get; set; } 
    public bool BooleanValue { get; set; } 
    public AnotherType AnotherProperty{ get; set; } 

}

其中AnotherType是一個類類型。引用類型的映射,直到所有的屬性被映射到目的地幾乎這種方式通過檢查屬性遞歸地執行:

object value = mapFrom.GetValue(input, null);     
mapTo.SetValue(output, value, null); 

其中mapForm和mapTo是的PropertyInfo對象。

問題開始時,帶有「位圖」屬性的新類型到達,我意識到整個類的對象不能用同樣的方式處理。

Class NewType 
{ 
    public Bitmap Bitmap{get;set;} 
    public string Name{get;set;} 
} 

對於像這樣的情況,你會推薦做什麼?顯然,複製屬性不會導致原始Bitmap對象的新副本。

PS

我不能使用automapper /發射映射器或任何其他外部包。

+0

爲什麼你不能使用Automapper? – Tigran

+0

這是這個項目的政策 – mhttk

回答

1

如果要實現一個映射器,而不是使用一些現有的:

我認爲這永遠在您身邊工作,這只是你的項目(這是一個好消息)的情況。問題是,就我而言,你到達了需要實現自定義映射器的地步。因此,使用映射基本功能定義一些基類,如BaseMapper,並從中派生出BitmapMapper:BaseMapper類,該類負責處理Bitmap類型對象的映射。

經過一段時間可能會得到一些其他類型,您將創建MyTypeMapper : BaseMapper與具體的映射實施。

這只是一個基本的想法,你應該想到這個找出最合適的方式具體的它爲你的項目執行。

如果使用自己的映射不是強制的,你可以使用一些現有的解決方案,可在市場上,例如像Automapper

問候。

+0

這也是我所傾向的。不能在這一個上使用外部庫。 – mhttk

+0

您可以使用運行重寫的具體映射器實現的獨特抽象SetMap屬性。 – Tigran

+0

是的,我想我是這個。現在實施一種遵循戰略模式的映射機制。這樣我就可以在策略存儲庫中查找任何映射。我也可以很容易地擴展它。 – mhttk

1

如果對象是ICLoneable,您可以利用它,您可以輕鬆檢查它是否是依賴於實現。對於不是ICloneable的對象this thread可能會幫助你。

Gert-Jan

+0

我喜歡ICloneable的方法(圖片實現它,肯定會工作),絕對你提到的線程是非常有幫助的。我不想依賴ICloneable解決可能隱藏的問題(克隆/深度克隆等)。無論如何 – mhttk