Подавить атрибут для одного метода во время компиляции?

Я использую PostSharp и хочу подавить (или изменить) существующий глобальный атрибут для одного метода в классе.

В приведенном ниже примере я хочу, чтобы класс «thisIsLogged()» регистрировался, а класс «thisIsNotLogged()» не регистрировался.

Однако это не работает: атрибут "[LogThis(false)]" просто добавляется к существующему атрибуту уровня класса, и логирование происходит в любом случае. Любые идеи?

[LogThis(true)] // uses PostSharp + SmartInspect to switch on logging for the entire class
class doSomething
{
  void thisIsLogged(int x)
  {
     // entry/exit from this class is automatically logged
  }
  [LogThis(false)] // aim: suppress logging for this method, if [LogThis(true)] is switched on for the entire class (however, this doesn't work as attributes are additive)
  void thisIsNotLogged(int x)
  {
     // I want to suppress the entry/exit logging for this class, to reduce log size
     // However, this *doesnt work*; logging occurs anyway
     // as attributes are additive - any ideas?
  }
}

Изменить:

Используется [LogThis(AttributeExclude=true)], все работает нормально (см. решение ниже).


person Contango    schedule 02.11.2010    source источник
comment
Нельзя ли просто удалить атрибут?   -  person Oded    schedule 02.11.2010
comment
Нет - если вы удалите атрибут из класса, то вам придется добавить его индивидуально во все 100 подметодов вручную и во все классы, которые наследуются от базы. Если вы применяете атрибут к классу, он применяется ко всем методам в классе по умолчанию, что намного проще. К счастью, при необходимости вы можете подавить атрибут для одного или двух отдельных методов (см. ниже).   -  person Contango    schedule 02.11.2010
comment
Кстати, не стесняйтесь попробовать готовые к использованию аспекты SmartInspect PostSharp: код . gurock.com/p/smartinspect-postsharp   -  person Dennis G.    schedule 07.01.2011


Ответы (1)


Рассмотрите возможность использования MethodPointcut, как Гаэль любезно предложил мне использовать, когда у меня возник похожий вопрос. Это дает вам большую гибкость, чтобы решить, какие методы дополнить аспектами, включая проверку атрибутов.

person Dan Bryant    schedule 02.11.2010
comment
Я также обнаружил еще один простой способ: просто используйте [LogThis(AttributeExclude=true)] для подавления атрибутов для определенного метода. Как только вы добавите это, он даже обновит графический интерфейс MSVS, чтобы удалить подчеркивание, указывающее, какие атрибуты прикреплены к методу. - person Contango; 02.11.2010