Как да приложа postsharp аспект само към методи, дефинирани в дъщерни класове на даден клас?

Мога ли да уточня, че аспект на PostSharp ще се прилага само към всички публични методи на дъщерни класове на даден клас?

Имам предвид, че имам ClassA и искам OnMethodBoundaryAspect да се прилага само към публични методи, дефинирани в класове, които са наследени от ClassA.


person Community    schedule 06.01.2015    source източник


Отговори (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, поведението на аспекта няма да бъде наследено.

person Daniel Balas    schedule 07.01.2015
comment
Благодаря за коментара ви, Даниел, но най-малкото не разбирам казаното от вас погрешно, с нито една от тези опции не получавам това, което искам: прилагане на атрибута към само към публични методи, дефинирани в класове, които са наследени от даден клас - person ; 07.01.2015
comment
@gsc-frank Въпросът не беше съвсем ясен. Актуализирах отговора си, за да съответства по-точно на предназначеното значение (надявам се). - person Daniel Balas; 07.01.2015