Как применить postharp аспект только к методам, определенным в дочерних классах данного класса?

Могу ли я указать, что аспект PostSharp будет применяться только ко всем открытым методам дочерних классов данного класса?

Я имею в виду, у меня есть ClassA и хочу, чтобы OnMethodBoundaryAspect применяться только к открытым методам, определенным в классах, которые унаследованы от ClassA,

1 ответ

Вам нужно использовать AttributeInheritance собственностью MulticastAttribute контролировать это поведение.

  • MulticastInheritance.None это поведение по умолчанию. Аспект не наследуется производными классами.
  • MulticastInheritance.Strict заставляет производные классы наследовать аспект от членов базового класса, то есть от переопределенных методов.
  • MulticastInheritance.Multicast заставляет производные классы полностью наследовать аспект, т. е. как если бы вы указали аспект в производном классе.

Затем вам нужно использовать AttributeTargetMemberAttributes из MulticastAttribute указать, к каким членам атрибут должен применяться. В вашем случае это будет AttributeTargetMemberAttributes = MulticastAttributes.Public,

Наконец, вам нужно заставить PostSharp не применять атрибут к самому базовому классу, вы можете использовать AttributeExclude свойство другого экземпляра атрибута, чтобы отключить аспект в определенных случаях.

Таким образом, "только для всех открытых методов дочерних классов данного класса" будет удовлетворено следующее:

[MyAspect(AttributeInheritance = MulticastInheritance.Multicast, AttributeTargetMemberAttributes = MulticastAttributes.Public)]
[MyAspect(AttributeExclude = true)]
public class ClassA
{
    //...
}

Обратите внимание, что это поведение во время компиляции, и вам нужно запустить PostSharp для всех проектов, которые являются производными от базового класса, чтобы он работал как задумано. Если вы унаследованы от класса в проекте, не улучшенном PostSharp, никакое аспектное поведение не будет наследоваться.

Другие вопросы по тегам