2011-02-01 3 views
5

Есть ли способ обернуть методы в других методах прозрачно в C#? Я хочу добиться того, что сделано с помощью функциональности Лоуса: http://search.cpan.org/perldoc?Moose::Manual::MethodModifiersC#: Методы обертывания другими методами

EDIT: И прозрачным я имею в виду без изменения оригинального метода.

+0

Возможно, вы можете с отличным отражением, но я не думаю, что это будет довольно ... – Alxandr

ответ

4

Я думаю, что вы ищете то, что называется Аспект-ориентированного программирования. Для этого есть много библиотек C#. Один из них называется PostSharp (бесплатная версия PostSharp поддерживает эту функцию). Вот пример, похожий на пример лося. Это создает Трассировка атрибут, который вы можете использовать другие методы, чтобы лавировать на эту дополнительную функциональность:

[Serializable] 
public class TraceAttribute : OnMethodBoundaryAspect 
{ 

    public override void OnEntry(MethodExecutionArgs args) 
    { 
     Trace.WriteLine("about to call method"); 
    } 

    public override void OnExit(MethodExecutionArgs args) 
    { 
     Trace.WriteLine("just finished calling method"); 
    } 
} 

Вы бы добавить его в метод «Foo» путем размещения Трассировка атрибута прямо перед ним:

[Trace] 
public void Foo() { /* ... */ } 

Теперь, когда Foo выполняет, перед ним будет запущен вышеописанный метод OnEntry, и OnExit будет работать сразу после.

+0

Могу ли я изменить аргументы по мере их передачи в функцию? Я вижу, что я их получаю, но я не могу сказать из документации, могу ли я их изменить. – rpkelly

+0

@rpkelly - Что конкретно вы надеетесь сделать с аргументами? –

+0

Ну, мне нужно записывать вызовы функции и ее возвращаемые значения, а также обрабатывать автоматическую генерацию «идентификатора транзакции», который передается в функцию (которая в настоящее время создается в другом месте). – rpkelly

2

Действительно, они называются «делегатами» в .NET. См:

за помощью.

+2

Закрыть. Но мне нужно сделать это, не переписывая оригинальный метод. Это то, что я подразумевал под прозрачным. Хотя, это аккуратно :) – rpkelly

0

Нет, не так, как это делается в Музе. Возможно, вам захочется заглянуть в некоторую библиотеку AOP.

2

Вы можете добиться такого же эффекта, используя динамический прокси. Примером может служить Castle Dynamic Proxy.

Такие структуры используют средства отражения C# для создания классов «прокси» или «обертка». Так что имейте это в виду. Из-за этого есть определенные накладные расходы. В качестве альтернативы вы можете использовать фреймворки, которые могут create classes statically via code generation.

0

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

Rhino Mocks stubs and mocks are only good for interfaces?

http://research.microsoft.com/en-us/projects/moles/

http://www.typemock.com/typemock-isolator-product3/

Смежные вопросы