Как перехватить вызовы методов в C # - PullRequest
6 голосов
/ 20 марта 2011

Я бы хотел перехватывать и вставлять пользовательский код при вызове стороннего кода в C #.Я использую внешнюю библиотеку (AutoIt) для автоматизации графического интерфейса.AutoIt dll предоставляется без исходного кода.

Все действия, выполняемые с этой платформой, выполняются из одного класса (AutoItClass), обеспечивающего доступ ко всем методам.Я хотел бы иметь возможность вставлять пользовательский код при вызове методов для этого класса, это возможно?Например:

  1. Записать некоторую информацию из вызываемого метода.
  2. Выполнить любое другое действие из метода (подождать X секунд).

Это было бы возможно очень просто, наследуя от этого класса и переопределяя все его методы (что является обязательным, поскольку это COM-объект), но это не предпочтительный способ.Любые комментарии будут полезны!

Ответы [ 2 ]

4 голосов
/ 20 марта 2011

Я бы не использовал наследование - вы можете использовать композицию здесь.Создайте свой собственный класс, который имеет те же методы - или фактически только те, которые вас интересуют - и делегируйте через это.Таким образом, вы можете быть уверены, что не будете «пропускать» какие-либо методы случайно, потому что все, что вы не реализуете, не будет вызываться через остальную часть вашей кодовой базы ... при условии, что остальная часть вашего кода неРазумеется, это не относится к классу исходной библиотеки.

3 голосов
/ 20 марта 2011

Вы можете исследовать PostSharp , который является коммерческим продуктом, который может вводить IL в скомпилированные сборки для выполнения аспектно-ориентированного программирования .Вы можете определить другой тип поведения, которое должно происходить, например, до и после выполнения метода, что, как вам кажется.Таким образом, поскольку PostSharp обрабатывает это на этапе после компиляции, вам не нужно создавать какие-либо унаследованные классы из классов, которые вы хотите перехватить.

В противном случае, если вы хотите более «чистое» решение, япоследует совету Джона о создании нового класса, который обернет функциональность того, который вы хотите перехватить.(см. Шаблон декоратора ).

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