У меня есть класс, который представляет собой внешнее физическое измерительное устройство. Упрощенная версия выглядит так:
public class Device {
public string Tag { get; set; }
public int Address { get; set; }
}
Tag
- это определяемое пользователем значение для идентификации устройства. Address
- это значение, используемое адаптером для связи с устройством. Если два экземпляра Device
имеют одинаковый Address
, то будет использоваться один и тот же внешний измерительный прибор.
Я хотел бы имитировать это поведение в коде (для использования таких методов, как Contains
и Distinct
) путем переопределения Equals
и реализации IEquatable<T>
:
public class Device : IEquatable<Device> {
public string Tag { get; set; }
public int Address { get; set; }
public override bool Equals(object obj) {
return Equals(obj as Device);
}
public bool Equals(Device other) {
if (null == other) return false;
if (ReferenceEquals(this, other)) return true;
return Address.Equals(other.Address);
}
}
Как видите, я игнорирую свойство Tag
в реализации Equals
.
Итак, мой вопрос: Должен ли я игнорировать свойство Tag
в реализации Equals
? Делает ли это таким образом код сложнее для понимания? Есть ли лучший способ сделать то, что я пытаюсь сделать? Мне нужно свойство Tag
, потому что часто пользователь не будет знать Address
, и даже не имеет ли Device
значение Address
(о котором говорится в файле App.config, и пользователь будет иметь дело с интерфейсом IDevice
, который не имеет свойства Address
).
Обновление:
Спасибо всем за ответы.
Итак, я понял, что должен использовать кастом IEqualityComparer
. Есть ли у вас какие-либо рекомендации, как это сделать, если мой реальный код будет выглядеть примерно так?
public interface IDevice {
string Tag { get; set; }
double TakeMeasurement();
}
internal class Device : IDevice {
public string Tag { get; set; }
public int Address { get; set; }
public double TakeMeasurement() {
// Take a measurement at the device's address...
}
}
Должен ли я проверить тип устройства в моем IEqualityComparer
?
public class DeviceEqualityComparer : IEqualityComparer<IDevice> {
public bool Equals(IDevice x, IDevice y) {
Contract.Requires(x != null);
Contract.Requires(y != null);
if ((x is Device) && (y is Device)) {
return x.Address.Equals(y.Address);
}
else {
return x.Equals(y);
}
}
public int GetHashCode(IDevice obj) {
Contract.Requires(obj != null);
if (obj is Device) {
return obj.Address.GetHashCode();
}
else {
return obj.GetHashCode();
}
}
}