Трябва да използвате свойството 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, поведението на аспекта няма да бъде наследено.
person
Daniel Balas
schedule
07.01.2015