Как применить 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, никакое аспектное поведение не будет наследоваться.