c#比较对象而不创建dto

c# comparing objects without creating dto

目前我正在创建一个 DTO 对象来比较新旧值。当它是一个对象时很好,但在未来这将会改变。我尝试为深层副本创建 extension methodserializedeserialize,但是 PostSharp 抛出错误。

Type 'PostSharp.Patterns.Model.NotifyPropertyChanged.ChangeTracking.ChildPropertyChangedProcessor' in Assembly 'PostSharp.Patterns.Model, Version=4.2.28.0, Culture=neutral, PublicKeyToken=e7f631e6ce13f078' is not marked as serializable. (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);
    }
}

有没有办法修复这个错误,或者我必须用其他方法来解决这个问题?如果我必须找到另一种方法,我应该采取什么方法?

有很多参考基于反射的深度对象图比较库; https://github.com/GregFinzer/Compare-Net-Objects 作为示例,无需序列化即可执行您想要的操作

您也可以为此使用 AutoMapper:(每个应用程序都应该使用它,所以有什么害处?)

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