C #: методы упаковки в других методах - PullRequest
5 голосов
/ 02 февраля 2011

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

РЕДАКТИРОВАТЬ: И под прозрачным я имею в виду без изменения исходного метода.

Ответы [ 5 ]

4 голосов
/ 02 февраля 2011

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

[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 прямо перед ним:1007 *

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

2 голосов
/ 02 февраля 2011

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

. Такие фреймворки используют средства отражения C # для создания классов 'proxy' или 'wrapper'.Так что имейте это в виду.Из-за этого есть определенные накладные расходы.В качестве альтернативы вы можете использовать фреймворки, которые могут создавать классы статически с помощью генерации кода .

2 голосов
/ 02 февраля 2011

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

за помощь.

0 голосов
/ 02 февраля 2011

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

Заглушки и насмешки Rhino Mocks хороши только для интерфейсов?

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

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

0 голосов
/ 02 февраля 2011

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

...