Вставить / обработать свойства getters / setters? - PullRequest
2 голосов
/ 31 октября 2011

Я написал абстрактный класс, который я использую для автоматизации многих вещей INotifyPropertyChanged и IDataErrorInfo. Однако для этого необходимо указать пользовательский метод получения / установки, который вызывает собственный метод для каждого свойства.

Чтобы избежать лишней типизации, я пытался найти способ переопределить / обработать свойства getter / setters в объекте и вызвать пользовательский метод вместо сгенерированного getter / setter.

Я пытался унаследовать от DynamicObject и переопределить TryGetMember и TrySetMember, однако эти методы работают, только если объект объявлен как динамический.

Итак, я хочу знать, возможно ли вообще то, что я пытаюсь достичь с помощью отражения .NET или какого-либо другого механизма, также есть ли способ определить, был ли определитель / получатель свойства определен в коде?

Спасибо, Алекс.

1 Ответ

3 голосов
/ 31 октября 2011

Вы можете получить информацию о свойствах типа, используя метод Type.GetProperties .Вы получите коллекцию объекта PropertyInfo .Эти объекты имеют свойства CanRead и CanWrite, которые сообщают, доступны ли свойства для чтения / записи.

Чтобы изменить это поведение, вам необходимо:

  1. Создать динамический прокси-генератор
  2. Динамические прокси должны перехватывать вызовы методов в форме get_PropA и set_PropA, которые фактически являются геттерами и сеттерами, где вы можете добавить свою дополнительную логику
  3. Вместо использования конструкторов в коде для создания этих объектов используйтеваш генератор прокси, который создаст объект и затем обернет его внутри прокси.
  4. Естественно, ваши классы не должны быть запечатаны, а свойства должны быть виртуальными, чтобы создать прокси

Для бесплатных решений лучше всего использовать Castle DynamicProxy .Если вы готовы потратить немного денег, взгляните на PostSharp , в котором уже реализовано много подобных вещей.Как, например, INotifyProperty chage, undo / redo и т. Д. Вы также можете взглянуть на любую платформу AOP, которая поддерживает переплетение аспектов, но DynamicProxy был бы моим выбором для ситуации, которую вы описали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...