2009-06-10 17 views
24

Scenario: Ho una classe base "MyBase". Ho un personalizzato attributo "MyAttrib"Uso forzato dell'attributo personalizzato

Con che faccio questo:

[MyAttrib(1234)] 
class MyClass : MyBase() 
{ 
MyClass() 
{ 
} 
} 

Domanda: Posso in tutte le classi di forza modo inherting da MyBase per avere la MyAttrib attributi?

risposta

25

No, non è possibile che il compilatore richieda un attributo in C#. Avete alcune altre opzioni a vostra disposizione. È possibile scrivere un test unitario che riflette su tutti i tipi nell'assieme e controlla l'attributo. Ma sfortunatamente non c'è modo di imporre al compilatore l'uso di un attributo.

+0

Vedere la risposta in basso di @ frederik-gheysels – devinbost

1

È possibile utilizzare PostSharp per questo. Eredita la classe attributo dalla classe OnMethodInvocationAspect (PostSharp) e sostituisce il metodo CompileTimeValidate.

Un po 'simile; anche se il contrario (ho solo voluto che un determinato attributo potrebbe essere applicato alle classi che hanno realizzato una specifica interfaccia): http://fgheysels.blogspot.com/2008/08/locking-system-with-aspect-oriented.html

2

Quello che ho fatto è stato avere una proprietà astratta o metodo nella classe MyBase, in modo che ereditare classi sono costretti a sovrascrivere (e quindi implementare) questa proprietà/metodo.

Non è pulito come un attributo, ma è meglio che controllare in fase di esecuzione a mio parere.

+0

Penso che questo sarebbe ancora più pulito, se si adatta allo scenario. –

0

Se si desidera garantire che tutte le classi di un tipo di base o di un'interfaccia abbiano un attributo, è possibile aggiungere un semplice test di unità che ottiene tutte le classi derivate e asserisce che ciascuna ha l'attributo e aggiunge i risultati dell'unità prova nel tuo ulteriore processo di costruzione.