2016-11-10 61 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现在可能是更好的解决方案。 –