Ho tentato di creare un attributo .NET personalizzato con il codice riportato di seguito, ma per sbaglio ho lasciato la sottoclasse. Questo ha generato un errore del compilatore facilmente risolto mostrato nel commento.Specificare la classe di base richiesta per gli attributi degli obiettivi .NET
// results in compiler error CS0641: Attribute 'AttributeUsage' is
// only valid on classes derived from System.Attribute
[AttributeUsage(AttributeTargets.Class)]
internal class ToolDeclarationAttribute
{
internal ToolDeclarationAttribute()
{
}
}
La mia domanda è come fa il compilatore conosce l'attributo [AttributeUsage]
può essere applicato solo ad una sottoclasse di System.Attribute
? Utilizzo di .NET Reflector Non vedo nulla di speciale nella dichiarazione della classe AttributeUsageAttribute
. Sfortunatamente questo potrebbe essere solo un caso speciale generato dal compilatore stesso.
[Serializable, ComVisible(true), AttributeUsage(AttributeTargets.Class, Inherited=true)]
public sealed class AttributeUsageAttribute : Attribute
{
...
Mi piacerebbe essere in grado di specificare che il mio attributo personalizzato può essere posizionato solo su sottoclassi di una particolare classe (o interfaccia). È possibile?
Questa limitazione a volte è un segno che si deve usare un interfaccia marcatore invece. Esegue le stesse funzioni, tranne quando è necessario passare i metadati a livello di classe come parametro. Quindi, se le istanze possono altrettanto facilmente dire, un conteggio di qualcosa, l'interfaccia può richiedere una proprietà pubblica per ottenerlo. Se deve essere di classe, sei bloccato con gli attributi. –