我需要在基类中编写一个通用方法,该方法接受 2 个对象作为参数并比较它们是否相等。
Ex:
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;
}
The AreEqual()
方法将接受 2 个实例DataTypeOne
或 2 个实例DataTypeTwo
.
我的猜测是我需要使用反射?如果 LINQ 更具可读性/简洁性,我可以使用它。
编辑:
我之所以想在基类中实现这个方法是因为项目限制。有大量开发人员致力于派生类。通过在基类中实现这一点,我试图让他们少担心一件事。
(假设您想要比较两个对象的所有字段是否相等。)
通常,您不会为此使用反射,您只需自己比较每个字段即可。这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);
}
}
另外,请考虑您的类型是否有意义struct
反而。值类型通过逐个字段比较来自动比较相等性。
请注意,通过覆盖Equals
,你基本上实现了(在我看来)你试图通过“主等于方法”方案实现的目标。也就是说,人们使用DataTypeTwo
将能够自然地测试相等性,而无需了解有关您的 API 的任何特殊信息——他们只会使用Equals
就像他们对待其他事情一样。
编辑:感谢贾里德提醒我GetHashCode
。您还需要覆盖它,通过确保任何两个“相等”的对象也返回相同的哈希代码来维持哈希表中的正常行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)