2011-02-10 18 views
15

Eventuali duplicati:
Specify required base class for .NET attribute targetsCome rendere attributo .NET valido solo su alcuni tipi

voglio precisare che attributo mia abitudine unica valida su certi tipi (basato sull'interfaccia o classe base).
Ti piace questa:

attributes

Come posso fare questo?

+0

Correggetemi se sbaglio: si vuole avere un 'FooAttribute' che, se applicato a qualcosa di diverso da un tipo derivato da' Fooable', mancherà la compilazione (o almeno produrre un avvertimento). –

+0

@Adam Robinson: sì, ora vedo che la domanda è un duplicato, ma la risposta data non è giusta per me -> avrei dovuto specificare che l'attributo e la restringente classe di base (o interfaccia) si trovano in diversi gruppi, quindi implementare l'attributo come una classe annidata non è pratico. – TDaver

+0

La risposta data qui è l'unico mezzo per ottenere ciò di cui stai parlando. A parte questo, è impossibile. –

risposta

12

Sembra che si voglia creare un Attribute che può essere applicato solo a determinati tipi in il modo in cui AttributeUsage può essere applicato solo ai tipi derivanti da Attribute. L'introduzione di questo tipo di restrizione personalizzata non è semplicemente possibile. L'errore particolare che stai vedendo non è dovuto a una restrizione personalizzata, ma è semplicemente cablato nel compilatore stesso.

+0

Infatti; l'apertura della classe 'Attribute' in Reflector mostra che non esiste una tale logica sulla classe stessa. –

+0

Questo è esattamente quello che ho fatto prima di chiedere qui :) – TDaver

2

Non penso che sia possibile, è possibile specificare solo su quale tipo di elemento di linguaggio l'attributo è valido. AttributeUsageAttribute è un caso speciale, perché il compilatore ne è a conoscenza e non consente di applicarlo a qualcosa che non è un attributo

+1

Odio quando usano trucchi CLR. Voglio farlo. – TDaver

+0

@TDaver: Non è il CLR che imbroglia, è il compilatore. Quindi, se scrivi il tuo compilatore personale, puoi aggiungere questa funzionalità :) Forse con la funzione "compiler as a service" di C# 5 diventa facile. –

Problemi correlati