C# 如何比较两个引用类型嵌套对象和动态对象的值
我有两个类型和值相同的对象 我如何通过价值来比较它们 经验: 那么,如何将这些对象与值进行比较呢 也许将来我想更改我的对象,所以我需要一种不依赖于对象属性名称和类型的通用方法只需在Person类中创建一个“相等函数”C# 如何比较两个引用类型嵌套对象和动态对象的值,c#,.net,compare,iequatable,C#,.net,Compare,Iequatable,我有两个类型和值相同的对象 我如何通过价值来比较它们 经验: 那么,如何将这些对象与值进行比较呢 也许将来我想更改我的对象,所以我需要一种不依赖于对象属性名称和类型的通用方法只需在Person类中创建一个“相等函数” public bool class Equals(Person source) { if(this.Name!=source.Name) return false; if(this.Surname!=source.Surname)return false;
public bool class Equals(Person source)
{
if(this.Name!=source.Name) return false;
if(this.Surname!=source.Surname)return false;
....
return true;
}
然后像这样使用:
if(myFirstPerson.Equals(mySecondPerson))
{
}
这样,如果不需要总是比较相同的属性,您可以放置任意数量的属性,然后甚至生成几个相等的函数。就我个人而言,我总是使用这种方式(而不是“if values equal”,而是“if values not equal then return false”),这在有很多值需要比较以及不同的相等函数时非常有用。使用json
将每个对象转换为json字符串,所有属性/字段按名称排序,然后比较两个字符串。这是缓慢的,但它的工作
使用反射
使用反射方法,逐个比较每个属性/字段。实际上,json库也做同样的工作。自己进行比较将节省转换为字符串的时间,但您必须深入研究嵌套类型
使用一些代码生成器,例如。
如果数据类型只是POCO类型,那么protobuf可能是一个不错的选择。它引入了很多优点:
- 对比构建
- json序列化和反序列化
- 非常快速的二进制序列化和反序列化
- 跨平台、跨语言,与grpc进程间通信集成良好
- 版本兼容性,当添加新字段时,应用程序仍然可以读取磁盘上的旧数据
我知道我可以将我的对象转换为JSON并进行比较。。。我想知道是否有更好的方法?当我将来不改变我的类时,IEquatable很好。你可以通过反射来实现:获取所有属性并检查它们。通过这种方式,您可以执行您想要的操作,例如,迭代抛出完整的类树(类类型的属性,如Address),如果需要,您可以创建自定义属性以从检查中排除某些属性。这是否回答了您的问题?谢谢,金牛,我试过反射和JSON,正如你所说。。。这两种方法都可以正常工作,但使用反射可以在更短的时间内完成
if(myFirstPerson.Equals(mySecondPerson))
{
}