比较2个自定义对象 - C#

Dot*_*ude 6 .net c#

我需要在基类中编写一个泛型方法,它接受2个对象作为参数,并将它们进行相等性比较.

例如:

public abstract class BaseData
{

  public bool AreEqual(object O1, object O2)
  {
    //Need to implement this
  }
}

public class DataTypeOne : BaseData
{
  public string Name;
  public string Address;
}

public class DataTypeTwo : BaseData
{
  public int CustId;
  public string CustName;
}
Run Code Online (Sandbox Code Playgroud)

该AreEqual()方法将接受2个实例DataTypeOne或2个实例DataTypeTwo.

我的猜测是我需要使用Reflection?我可以使用LINQ,如果它更可读/简洁.

编辑:我想在基类中实现此方法的原因是因为项目限制.有大量的开发人员在派生类上工作.通过在基类中实现这一点,我试图让他们少担心一件事.

mqp*_*mqp 13

(假设你想要的是比较两个对象的所有字段是否相等.)

通常情况下,您不会为此使用反射,您只需自己比较每个字段.该IEquatable<T>接口存在于此目的,您也可能希望覆盖有Object.Equals()问题的类型.例如:

public class DataTypeTwo : BaseData, IEquatable<DataTypeTwo>
{
    public int CustId;
    public string CustName;

    public override int GetHashCode()
    {
        return CustId ^ CustName.GetHashCode(); // or whatever
    }

    public override bool Equals(object other)
    {
        return this.Equals(other as DataTypeTwo);
    }

    public bool Equals(DataTypeTwo other)
    {
        return (other != null &&
                other.CustId == this.CustId &&
                other.CustName == this.CustName);
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,请考虑您的类型是否有意义struct.值类型通过逐个字段比较自动比较相等性.

请注意,通过覆盖Equals,您基本上可以实现您尝试使用"master equals方法"方案实现的(在我看来).也就是说,使用的人DataTypeTwo将能够自然地测试平等,而不必知道关于你的API的任何特殊内容 - 他们只会Equals像使用其他东西一样使用它们.

编辑:感谢Jared提醒我GetHashCode.您还希望通过确保任何两个"相等"的对象也返回相同的哈希码来覆盖它以维护哈希表中的正常外观行为.