Атрибут C # для изменения методов

2

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

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

Теги:
reflection
attributes

2 ответа

5
Лучший ответ

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

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

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

[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. В этом примере я хочу ограничить его применимость только к общедоступным, не абстрактным методам.

Там гораздо больше вы можете посмотреть (в AOP вообще).

  • 0
    Спасибо, например, это то, что мне было нужно. Как я понимаю, такая техника не дает потери производительности во время выполнения?
  • 0
    Лучший способ удовлетворить ваши проблемы с производительностью - это измерить производительность и посмотреть, достаточно ли она хороша. Тем не менее, простая вещь заключается в том, чтобы просто открыть результирующую сборку в рефлекторе ( red-gate.com/products/reflector ) и посмотреть на полученный код. Посмотрите, что вы думаете. Мы не видели проблем с производительностью при использовании этой техники на работе.
5

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

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

  • 2
    PostSharp - перенос АОП в .NET ( postsharp.org )
  • 0
    В конце связанной страницы Википедии есть больше расширений .NET-AOP (сноска 6).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню