2016-11-10 94 views
1

目前,我正在創建一個對象的DTO來比較新值和舊值。當它是一個對象時很好,但將來會發生變化。我試圖創建一個extension methodserializedeserialize深層複製,但PostSharp是拋出一個錯誤。c#比較對象而不創建dto

類型 'PostSharp.Patterns.Model.NotifyPropertyChanged.ChangeTracking.ChildPropertyChangedProcessor' 在大會 'PostSharp.Patterns.Model,版本= 4.2.28.0, 文化=中性公鑰= e7f631e6ce13f078' 沒有被標記爲 可串行化。 (SerializationException)

這是我的擴展方法,錯誤正在拋出在formatter.Serialize(stream, source)

public static T Clone<T>(this T source) 
{ 
    if (!typeof(T).IsSerializable) 
    { 
     return default(T); 
    } 

    if (ReferenceEquals(source, null)) 
    { 
     return default(T); 
    } 

    var formatter = new BinaryFormatter(); 
    Stream stream = new MemoryStream(); 
    using (stream) 
    { 
     formatter.Serialize(stream, source); 
     stream.Seek(0, SeekOrigin.Begin); 
     return (T) formatter.Deserialize(stream); 
    } 
} 

有沒有辦法解決這個錯誤,或者我必須以另一種方式做到這一點?如果我不得不另外找到我應該採取的方法嗎?

+0

你嘗試升級到PostSharp 4.3? NotifyPropertyChanged方面的類如何增強您的類? –

回答

2

您可以使用AutoMapper對於這個問題,以及:(每個應用程序無論如何都應該使用它,所以有什麼害處呢?)

var clone = new Poco(); 
Mapper.CreateMap<Poco, Poco>(); 
Mapper.Map<Poco, Poco>(source, clone); 
1

有很多對基於反射的深層對象圖比較庫的參考; https://github.com/GregFinzer/Compare-Net-Objects作爲一個例子應該做你想要什麼,而不繫列化

+0

這實際上是否會創建一個深層副本? –

+0

否 - 但是它們用於行走對象樹的方法可以很容易地用於創建副本。 – PhillipH

+0

感謝您的支持,我認爲它可以在未來派上用場,但AutoMapper現在可能是更好的解決方案。 –