Сравнение объектов ссылочного типа по значению без перезаписи методов Equals вручнуюC#

Место общения программистов C#
Ответить
Anonymous
 Сравнение объектов ссылочного типа по значению без перезаписи методов Equals вручную

Сообщение Anonymous »

Возможно, это вопрос для новичков, но у меня есть проблема, для которой я не смог найти существующего решения и надеялся, что вы мне поможете.
Я хотел бы сравнить примеры объекта ссылочного типа по значению без перезаписи метода .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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»