我想检查两个没有公共属性的对象之间的相等性 . 但是,我不想重写Equals和GetHashCode方法,或实现IEquatable . 例如,请考虑以下代码:
class Program
{
static void Main(string[] args)
{
Guid id = Guid.NewGuid();
string personName = "MyName";
MyClass object1 = new MyClass(id, personName);
MyClass object2 = new MyClass(id, personName);
//This returns false, but I'd like it to return true:
Console.WriteLine(object1.Equals(object2));
//[edit]...by using, for example:
Console.WriteLine(ObjectsAreEqual(object1, object2));
}
}
class MyClass
{
private Guid _id;
private string _personName;
public MyClass(Guid id, string personName)
{
_id = id;
_personName = personName;
}
}
我知道标准方法是重写Equals和GetHashCode,但由于各种原因,我不想更改类中的任何代码 . 此外,没有公共 property ,所以我无法比较这些 . 有没有其他方法来实现这个?
例如,通过反思?或者可能通过将Objects序列化为JSON,并比较生成的字符串?
谢谢 .
3 回答
如果不重写它,则无法更改
Equals
实例方法的结果 . 因此,您需要使用IEqualityComparer<T>
,需要将其显式传递给需要进行相等性检查的代码 . 幸运的是,大多数内置集合都接受这样的相等比较器作为其构造函数的参数 .如果您不想以任何方式更改原始类,则使用反射实现
IEqualityComparer<T>
似乎是您唯一的选择 .您可以使用
GetField("_personName",BindingFlags.NonPublic)
获取FieldInfo
,然后在其上调用GetValue
以获取值 .您可以创建使用反射的自定义IEqualityComparer<T>实现:
您可以向MyClass添加成员函数并检查其中的私有字段:
或者,如果无法更改MyClass实现,则添加扩展方法,并使用反射进行比较,如 CodeInChaos 所述: