2012-01-19 11 views
7

Recentemente ho letto di attributi e riflessioni e ho pensato che sarebbe stato un buon metodo per includere i metadati nel mio programma. Ho questa classe astratta e volevo che tutte le classi ereditassero da essa per dichiarare con la classe qualche attributo, dal momento che volevo creare componenti personalizzati (quelle classi derivate) per il mio programma e volevo leggere i metadati di queste classi su runtime. Tuttavia, tutte le classi derivate devono dichiarare esplicitamente l'attributo in cui memorizzo i metadati. Quindi, come posso forzare una dichiarazione di attributo nelle classi derivate? Grazie.Dichiarazione di attributo di forza nelle classi derivate

risposta

4

Definire la classe di attributo a sé stesso ha un attributo AttributeUsageAttribute dove la proprietà Inherited è true.

o non, dato che è il default ...

obiettivi derivati ​​(cioè le classi se l'attributo è su una classe, metodi, se si tratta di un metodo, etc.) sarà poi ereditare il attributo senza dichiarazione esplicita.

+0

fantastico! Grazie. – irisjay

2

Se per "forza" si intende "imposizione del tempo di compilazione": non è possibile.

1

Come ha detto Daniel, non è possibile applicare gli attributi in fase di compilazione.

Ma se si desidera leggere i dati in fase di runtime, perché preoccuparsi di attributi e riflessioni? È possibile creare un metodo astratto nella classe astratta:

abstract class Base 
{ 
    public abstract string Metadata(); 
} 

class Derived1 : Base 
{ 
    public override string Metadata() 
    { 
     return "Metadata for Derived1"; 
    } 
} 

class Derived2 : Base // won't compile, since Metadata has not been provided 
{ 
} 

Il comportamento è leggermente diverso, ovviamente. Con questa opzione, è necessario un riferimento a un'istanza della classe derivata anziché solo le informazioni sul tipo stesso. D'altra parte, evita la riflessione.

+0

tuttavia, il problema è che voglio recuperare i metadati semplicemente dall'assembly, senza istanze di classe. Come lo posso fare? – irisjay

+0

@testgo: ho paura, la mia soluzione suggerita non è quindi utilizzabile per te. – Heinzi

1

Come dice Daniel, non è possibile forzare in fase di compilazione. È possibile aggiungere gli attributi al genitore astratto e prelevarli.

Un'altra opzione consiste nell'aggiungere un metodo per verificare l'esistenza dell'attrributo nella classe padre e generare un'eccezione se non presente. Chiamalo con metodi appropriati.

Problemi correlati