Общий метод, чтобы обернуть функцию - PullRequest
4 голосов
/ 21 декабря 2011

Скажем, я хочу обернуть функцию в другую функцию, чтобы добавить некоторые функции в обернутую функцию. Но я не знаю заранее тип возвращаемого значения или параметры, так как методы генерируются как прокси-сервер веб-службы.

Мой первый ход мысли использовал Func<T>. Но некоторые функции могут возвращать void, в этом случае Action<T> будет более подходящим.

Теперь мой вопрос: есть ли хороший общий способ добиться этого? Есть ли какой-то шаблон, который мне нужно искать?

Ответы [ 2 ]

3 голосов
/ 21 декабря 2011

Ну, на ум приходит Facade Pattern ... Это не очень автоматический способ делать вещи, но он работает.Вы просто ставите другой интерфейс перед прокси и вместо этого вызываете его.Затем вы можете добавить любую функциональность, какую пожелаете.

Еще один способ решения этой проблемы - аспектно-ориентированное программирование .Я использовал PostSharp (когда он был бесплатным), чтобы сделать это в прошлом.Вы можете сделать такие вещи, как добавление предварительной / последующей обработки в функцию, добавив атрибут к методу / свойству.Затем компоненты AOP используют переплетение кода, чтобы переписать ваш IL, чтобы включить код, на который вы ссылались.Обратите внимание, что это может значительно замедлить процесс сборки.

1 голос
/ 21 декабря 2011

Поскольку вы говорите: «Я не знаю тип возвращаемого значения или параметры заранее», я думаю, Динамический прокси - это то, что вы необходимо.

К сожалению, я знаю только о динамическом прокси в Java. Но я уверен, что есть что-то подобное для C #.

Попробуйте поискать в Google "Dynamic Proxy C #".

Например, здесь, кажется, есть реализация для C #: http://www.castleproject.org/dynamicproxy/

Итак, что такое динамический прокси?

Из JavaDoc http://docs.oracle.com/javase/1.3/docs/guide/reflection/proxy.html#api:

Динамический прокси-класс - это класс, который реализует список интерфейсов, указанных во время выполнения , так что вызов метода через один из интерфейсов в экземпляре класса будет закодирован и отправлен другому объекту через единый интерфейс. Таким образом, динамический прокси-класс может использоваться для создания прокси-объекта с безопасным типом для списка интерфейсов без необходимости предварительной генерации прокси-класса, например, с помощью инструментов времени компиляции. Вызовы методов для экземпляра динамического прокси-класса отправляются в единственный метод в обработчике вызовов экземпляра , и они кодируются с помощью объекта java.lang.reflect.Method, идентифицирующего метод, который был вызван, и объекта. массив типа Object, содержащий аргументы.

...