Атрибут C # для изменения методов - PullRequest
2 голосов
/ 01 ноября 2009

все. Может быть, я недостаточно гуглил, но не могу найти ни одного примера по этому вопросу.

Возможно ли в C # создать собственный атрибут, который применительно к классу изменяет все его методы? Например, добавляет Console.WriteLine("Hello, i'm modified method"); в качестве первой строки (или это эквивалентно IL, если это сделано во время выполнения)?

Ответы [ 2 ]

5 голосов
/ 01 ноября 2009

Да, вы можете сделать это, но нет, это не встроено в C #. Как говорит Эрик, этот метод известен как Аспектно-ориентированное программирование.

Я использовал PostSharp на работе, и это очень эффективно. Он работает во время компиляции и использует IL-ткачество, в отличие от других методов АОП.

Например, следующий атрибут будет делать то, что вы хотите:

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method | MulticastTargets.Class,
                         AllowMultiple = true,
                         TargetMemberAttributes = MulticastAttributes.Public | 
                                                  MulticastAttributes.NonAbstract | 
                                                  MulticastAttributes.Managed)]
class MyAspect : OnMethodInvocationAspect
{
    public override void OnInvocation(MethodInvocationEventArgs eventArgs)
    {
        Console.WriteLine("Hello, i'm modified method");

        base.OnInvocation(eventArgs);
    }
}

Вы просто применяете MyAspect в качестве атрибута вашего класса, и он будет применяться ко всем методам в нем. Вы можете контролировать, как применяется аспект, изменяя свойство TargetmemberAttributes свойства MulticastAttributeUsage. В этом примере я хочу ограничить его применение только к публичным неабстрактным методам.

Вы можете сделать гораздо больше, посмотрите (в целом на АОП).

5 голосов
/ 01 ноября 2009

Нет. То, что вы ищете, это аспектно-ориентированное программирование ( AOP ).

С помощью AOP вы указываете pointcut, место, куда вы хотите вложить в код, и код, который вы хотите выполнить в этой точке. Трассировка является стандартным примером для АОП. Вы указываете набор методов и ткач / компилятор, чтобы добавить вам вызов log / tracing в начале или конце этих методов.

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