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

how to compare values of two reference type nested and dynamic objects

我有两个具有相同类型和值的对象 我如何按价值比较它们?

exp:

    class Person 
    {
    
    public string Name { get; set; }
    
    public DateTime BirthDate { get; set; }

    public Address Address { get; set; }
    
    }

class Address
    {
    
    public string City { get; set; }
    
    public int ZipCode { get; set; }
    
    }
    
    var p1 = new Person()
    {
    Name = "John doe",
    BirthDate = new DateTime(2000, 1, 1),
    Address = new Address(){
         City = "some city",
         ZipCode = 123456
    }
    };
    
    var p2 = new Person()
    {
    Name = "John doe",
    BirthDate = new DateTime(2000, 1, 1),
    Address = new Address(){
        City = "some city",
        ZipCode = 123456
    }
    };

那么如何比较这些对象的价值?

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

只需在你的 Person 中创建一个“Equal 函数”class

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

这样你可以放置任意多的属性,如果你不需要总是比较相同的属性,甚至可以创建几个 Equals 函数。就我个人而言,我总是使用这种方式(而不是“如果值相等”,我使用“如果值不等于则 return false”),当你有很多值要比较时非常有用,并且有不同的相等函数。

使用json

将每个对象转换成一个json字符串,所有properties/fields按名称排序,然后比较两个字符串。这很慢,但它有效。

使用反射

使用反射的方法,将每个property/field一一比较。实际上 json 库做同样的工作。自己进行比较会节省转换为字符串的时间,但您必须深入研究嵌套类型。

使用一些代码生成器,例如protobuf

如果数据类型只是POCO类型,也许protobuf是个不错的选择。它介绍了很多优点:

  • 内置比较
  • json序列化和反序列化
  • 非常快的二进制序列化和反序列化
  • 跨平台跨语言,与grpc进程间通信集成良好
  • 版本兼容性,添加新字段时,应用程序仍可读取磁盘上的旧数据。