Я хотел бы сравнить примеры объекта ссылочного типа по значению без перезаписи метода .Equals() вручную в этом классе и его дочерних элементах. Это потому, что я не хочу писать весь этот код в классе, особенно в классе, где много дочерних элементов, так как это сильно усложнит и без того огромную базу кода. Есть ли способ сравнить два объекта такого класса (или его дочерних элементов) без необходимости писать реализацию для каждого отдельного класса?
Запись не является вариантом, поскольку она должна оставаться mutable.
Структура невозможна, так как мне все равно хотелось бы, чтобы объекты были ссылочного типа, поскольку они довольно часто передаются.
В идеале мне бы также хотелось иметь возможность использовать только «сравнение типов значений» в некоторых случаях, оставляя «сравнение ссылочных типов» по умолчанию.
Есть ли способ сделать это изначально в С# без написания дополнительной функции/перезаписи .Equals() и .GetHash() для каждого класса, наследуемого от рассматриваемого класса?
Мой код выглядит несколько похоже на это:
Код: Выделить всё
using System;
namespace SubwaySystem{
public abstract class Passenger {
public string name;
public int identificationNumeber;
public int age;
}
public class SingleTicketPassenger : Passenger
{
public string ticketModel;
public string ticketprice;
}
public class SubscriptionPassenger : Passenger
{
public DateTime subscriptionExpiryDate;
public int subscriptionPrice;
public string subscriptionModel;
}
public class GateHopper : Passenger
{
public string entryStation;
public string? arrestRecordID;
public bool firstOffence;
}
// many more classes inherenting from Passenger
public class Subway {
public Passenger oldestPassengerOnBoard;
public string model;
public string line;
public DateTime constructionDate;
public int speed;
public override bool Equals(object? obj)
{
var otherSubway = obj as Subway;
return this.Equals(otherSubway);
}
public bool Equals(Subway otherSubway)
{
return otherSubway != null &&
otherSubway.oldestPassengerOnBoard == oldestPassengerOnBoard &&
otherSubway.model == model &&
otherSubway.line == line &&
otherSubway.constructionDate == constructionDate &&
otherSubway.speed == speed;
}
public override int GetHashCode()
{
unchecked
{
int hash = 7;
hash = hash * 11 + oldestPassengerOnBoard.GetHashCode();
hash = hash * 11 + speed.GetHashCode();
return hash;
}
}
}
}
В конце концов, мне бы хотелось иметь изменяемую запись. Или что-то вроде метода .CompareByValue() для общих объектов.
Подробнее здесь: https://stackoverflow.com/questions/791 ... ethods-man
Мобильная версия