2015-01-06 8 views
0

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

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

ответ

0

Для управления этим поведением вам необходимо использовать AttributeInheritance property of 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, никакое поведение в аспект не будет унаследовано.

+0

Спасибо за ваш комментарий Даниэль, но, по крайней мере, я неправильно понимаю, что вы сказали, и ни один из этих вариантов не получил то, что я хочу: примените атрибут к * "только к общедоступным методам, определенным в классах, унаследованных от" данного класса * –

+0

@ gsc-frank Вопрос был не совсем ясен. Я обновил свой ответ, чтобы он соответствовал намеченному значению более тесно (надеюсь). –