Я пытаюсь использовать отражение, чтобы определить результат вызова .Equals для двух разных, но "равных" экземпляров типа.
Мой метод будет выглядеть примерно так:
public static bool TypeComparesProperties(Type t)
{
// return true if (an instance of t).Equals(a different instance of t)
// will be true if all publicly accessible properties of the instances
// are the same
}
В качестве примера:
string a = "Test";
string b = "Test";
bool areEqual = a.Equals(b); // areEqual will be true
// so:
TypeComparesProperties(typeof(string)); // should return true
Однако, учитывая:
public class MyComplexType
{
public int Id { get; set; }
public string MyString { get; set; }
}
MyComplexType a = new MyComplexType {Id = 1, MyString = "Test"};
MyComplexType b = new MyComplexType { Id = 1, MyString = "Test" };
bool areEqual = a.Equals(b); // areEqual will be false
// so:
TypeComparesProperties(typeof(MyComplexType)); // should return false
Если бы я реализовал IEquatable<MyComplexType>
в своем классе следующим образом, я бы получил значение true:
public class MyComplexType : IEquatable<MyComplexType>
{
public int Id { get; set; }
public string MyString { get; set; }
public bool Equals(MyComplexType other)
{
return (Id.Equals(other.Id) && MyString.Equals(other.MyString));
}
}
Я полагаю, что, вероятно, я могу сделать это, создав два экземпляра с помощью отражения, а затем установив для всех свойств значения, заданные по умолчанию. Хотя это много работы и много накладных расходов, и я думаю, что я столкнулся бы с проблемами, если бы в типе не было пустого конструктора.
Есть еще идеи?
Edit:
Кажется, люди смущены моими намерениями. Я приношу извинения. Надеюсь, это уточнит:
У меня есть метод, который должен сравнивать два объекта в меру своих возможностей. Простого вызова .Equals () будет недостаточно, потому что либо:
- Объекты будут типами значений или будут хорошо реализовывать IEquatable, и я получу истинный ответ. Отлично!
- Объекты могут иметь все одинаковые свойства и быть "равными", но, поскольку они являются разными экземплярами, я получу ложный ответ. Я не могу сказать, является ли это ложным, потому что объекты не "равны", или потому что они просто разные экземпляры .
Так что, на мой взгляд, метод сравнения должен:
- Проверьте тип объекта, чтобы увидеть, будет ли метод
Equals
возвращать true для двух разных экземпляров с одинаковыми общими свойствами.
- Если это так, вызовите метод
Equals
и верните результат
- Если нет, посмотрите на все свойства и поля и сравните их, насколько я могу, чтобы определить, равны ли они
Теперь я понимаю, что могу просто перейти к шагу 3, но если есть способ заранее определить, необходимо ли это, это сэкономит время.
Редактировать 2:
Я собираюсь закрыть это по нескольким причинам:
- Чем больше я об этом говорю, тем больше понимаю, что то, что я спрашивал, не то, что я действительно хотел сделать
- Даже если бы я действительно хотел это сделать, реального ярлыка нет вообще. RE ранее отредактируйте, я все равно должен просто перейти к шагу 3.
Спасибо всем за ваш вклад.