2010-03-04 6 views
7

Desidero poter applicare un attributo a un'interfaccia in modo che ogni metodo in qualsiasi classe che implementa tale interfaccia abbia l'attributo applicato ad esso.Applicazione di un attributo a un'interfaccia utilizzando PostSharp

Ho pensato che sarebbe simile a questa:

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

Eppure, quando mi applico a un'interfaccia come qui di seguito, il codice OnEntry/OnExit nella attributo viene mai accede quando il metodo viene chiamato nella classe implementa l'interfaccia:

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

Se si applica l'attributo all'interno della classe stessa applicazione, come sotto, funziona bene:

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

Cosa mi manca/faccio di sbagliato?

risposta

7

devi usare:

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

Oppure:

[Test(AttributeInheritance=MulticastInheritance.Multicast] 
public interface ISystemService 
+0

La seconda ha funzionato. Grazie. – krisg

1

Cosa mi manca/faccio di sbagliato?

interfaccia

ha alcuna implementazione, quindi non può eseguire qualsiasi 'codice OnEntry/OnExit'.

Credo che dovresti ereditare da una classe.


Inoltre è possibile Multicast the attribute, ma è necessario ereditare da MulticastAttribute.

+0

Citando la documentazione PostSharp: "si può mettere un attributo personalizzato su un'interfaccia e hanno implicitamente applicato su tutte le classi di attuazione che interfaccia." Ergo, se lo applico alla classe e lo applica a tutti i metodi/proprietà al suo interno, quindi con la dichiarazione di cui sopra, applicandolo a un'interfaccia dovrebbe fare lo stesso. Destra? – krisg

+0

Si applica a "Multicasting attributo personalizzato". Ho fornito il link nella risposta. –

+0

@Dmitrii, i collegamenti sono interrotti. Intendevi http://doc.sharpcrafters.com/postsharp-2.0/##PostSharp-2.0.chm/html/42748720-e440-487a-a332-4c6b447d349c.htm e http://doc.sharpcrafters.com/postsharp -2.0/## PostSharp-2.0.chm/html/T_PostSharp_Extensibility_MulticastAttribute.htm –

Problemi correlati