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

问题描述

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

经验:

    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",Address = new Address(){
        City = "some city",ZipCode = 123456
    }
    };

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

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

解决方法

使用json

将每个对象转换为json字符串,所有属性/字段按名称排序,然后比较两个字符串。这很慢,但有效。

使用反射

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

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

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

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

只需在你的 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))
{
    
}

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