Класс атрибута A1
объявляет авто-свойство с частным вспомогательным полем, созданным компилятором.
Теперь, когда метод Attribute.Equals
отображает более A2
для доступа ко всем его полям экземпляра ( Attribute.Equals не отражает свойства), он "не увидит" msgstr "закрытое поле поддержки, объявленное в A1
, так как закрытые члены базового типа не доступны через производный тип. (См. Также здесь: Частные члены наследуются в C #? )
Таким образом, при попытке сравнить два экземпляра типа A2
- который сам по себе не объявляет никаких полей - с использованием реализации Attribute.Equals , результатом будет true
(поскольку тип два экземпляра атрибута имеют одинаковый тип A2
, и экземпляры не содержат полей, которые были бы доступны через тип A2
).
Возможные решения (в зависимости от действующего сценария приложения) могут включать (среди прочего) использование открытых полей вместо открытых свойств в классах атрибутов или, возможно, переопределение метода Equals()
в базовом классе атрибутов (A1
), который отражает и сравнивает тип, все открытые поля и дополнительно все открытые свойства двух экземпляров атрибута.