Неортодоксальный подход мог бы использовать платформу AOP, такую как PostSharp, для «переплетения» обработчика до / после вызова метода доступа, который запускает событие.
Вы создаете внешний класс, который содержит код предварительной и / или последующей обработки для доступа к вашему свойству, проверяет, изменилось ли значение свойства между pre и post, и вызывает событие.
Имейте в виду, что, принимая значение для сравнения (внутри кода вашего обработчика), вы можете попасть в бесконечный цикл (вы вызываете метод доступа к свойству, который вызывает обработчик AOP, который вызывает метод доступа и т. Д.), Поэтому вам может потребоваться отразить в классе, содержащем это свойство, чтобы получить вспомогательное поле.