MethodInterceptionAspect работает на методах, объявленных во внешних библиотеках путем перехвата вызова на месте вызова. Это означает, что сам метод не преобразуется, и вместо этого место, где вы вызываете метод, изменяется. Оригинальная сборка не преобразуется.
Вы можете сделать это многоадресным атрибут на сборке и явное указание AttributeTargetAssemblies
:
[assembly:MyAspect(AttributeTargetAssemblies="myassembly,...", AttributeTargetTypes="...", AttributeTargetMembers="..."]
Это подразумевает некоторые ограничения. Например, если код вызывается из внешнего кода, вызов не будет перехвачен. В вашем случае вы можете использовать это для перехвата метода, который всегда вызывается из кода дизайнера (например, this.Controls.Add(...)
).
В случае кнопок в исходном коде, я думаю, что будет другой жизнеспособный подход. Если вы создаете LocationInterceptionAspect
и многоадресную рассылку по всем полям типа Button
, вы сможете перехватить создание всех кнопок в вашем приложении. В коде аспекта (set handler) вы можете зарегистрироваться на событие Clicked
этих кнопок.
Это неэффективно, так как я должен обернуть все элементы пользовательского интерфейса только для того, чтобы захватить их события :( –
Для событий, что вы хотите сделать? Не работал бы обычный обработчик событий? – Batavia
Я просто хочу знать, когда нажмите кнопку, для всех кнопок в программе. –