c#比较对象而不创建dto
c# comparing objects without creating dto
目前我正在创建一个 DTO
对象来比较新旧值。当它是一个对象时很好,但在未来这将会改变。我尝试为深层副本创建 extension method
到 serialize
和 deserialize
,但是 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);
目前我正在创建一个 DTO
对象来比较新旧值。当它是一个对象时很好,但在未来这将会改变。我尝试为深层副本创建 extension method
到 serialize
和 deserialize
,但是 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);