Применение атрибута к интерфейсу с помощью PostSharp

Я хочу иметь возможность применять атрибут к интерфейсу, чтобы к каждому методу в любом классе, реализующем этот интерфейс, применялся атрибут.

Я предполагал, что это будет выглядеть примерно так:

[Serializable]
[AttributeUsage(AttributeTargets.All, Inherited = true)]
public sealed class TestAttribute : OnMethodBoundaryAspect
{
    ...
}

Тем не менее, когда я применяю его к интерфейсу, как показано ниже, код OnEntry/OnExit в атрибуте никогда не используется, когда метод вызывается в классе, реализующем интерфейс:

[Test]
public interface ISystemService
{
    List<AssemblyInfo> GetAssemblyInfo();
}

Если я применяю атрибут в самом реализующем классе, как показано ниже, он работает нормально:

[Test]
public class SystemService : ISystemService
{
    ...
}

Что я упускаю/делаю неправильно?


person krisg    schedule 04.03.2010    source источник


Ответы (2)


Вы должны использовать:

[MulticastAttributeUsage(..., Inheritance=MulticastInheritance.Multicast)]
public sealed class TestAttribute : OnMethodBoundaryAspect 

Or:

[Test(AttributeInheritance=MulticastInheritance.Multicast] 
public interface ISystemService 
person Gael Fraiteur    schedule 04.03.2010

Что я упускаю/делаю неправильно?

Интерфейс не имеет реализации, поэтому не может выполнять код OnEntry/OnExit.

Я считаю, что вы должны наследовать от класса.


Кроме того, вы можете многоадресно передавать атрибут, но вам нужно наследовать от Атрибут многоадресной рассылки.

person Dmytrii Nagirniak    schedule 04.03.2010
comment
Цитируя документацию PostSharp: вы можете поместить пользовательский атрибут в интерфейс и неявно применить его ко всем классам, реализующим этот интерфейс. Следовательно, если я применяю его к классу, и он применяет его ко всем методам/свойствам в нем, то, согласно приведенному выше утверждению, применение его к интерфейсу должно делать то же самое. Верно? - person krisg; 04.03.2010
comment
Это относится к «многоадресной рассылке настраиваемых атрибутов». Я дал ссылку в ответе. - person Dmytrii Nagirniak; 04.03.2010
comment
@Dmitrii, ссылки битые. Возможно, вы имели в виду doc.sharpcrafters.com/postsharp-2.0/##PostSharp-2.0.chm/html/ и doc.sharpcrafters.com/postsharp-2.0/##PostSharp-2.0.chm/html/ - person Michael Freidgeim; 21.11.2011
comment
На момент ответа ссылки работали. Не стесняйтесь обновлять мой ответ новыми ссылками. Я уже не помню :) - person Dmytrii Nagirniak; 22.11.2011