Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何比较两个引用类型嵌套对象和动态对象的值_C#_.net_Compare_Iequatable - Fatal编程技术网

C# 如何比较两个引用类型嵌套对象和动态对象的值

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;

我有两个类型和值相同的对象 我如何通过价值来比较它们

经验:

那么,如何将这些对象与值进行比较呢

也许将来我想更改我的对象,所以我需要一种不依赖于对象属性名称和类型的通用方法

只需在Person类中创建一个“相等函数”

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))
{
    
}