AttributeUsage (C# e Visual Basic)
Determina come può essere utilizzata una classe di attributi personalizzati. AttributeUsage è un attributo che può essere applicato alle definizioni di attributi personalizzati per controllare il modo in cui i nuovi attributi possono essere applicati. Quando vengono applicate in modo esplicito, le impostazioni predefinite sono simili a quanto riportato di seguito:
<System.AttributeUsage(System.AttributeTargets.All,
AllowMultiple:=False,
Inherited:=True)>
Class NewAttribute
Inherits System.Attribute
End Class
[System.AttributeUsage(System.AttributeTargets.All,
AllowMultiple = false,
Inherited = true)]
class NewAttribute : System.Attribute { }
In questo esempio la classe NewAttribute può essere applicata a una qualsiasi entità del codice che supporta gli attributi, ma può essere applicata una sola volta a ciascuna entità. Se applicata a una classe base, viene ereditata dalle classi derivate.
Gli argomenti AllowMultiple e Inherited sono facoltativi. Di conseguenza, il codice riportato di seguito otterrà lo stesso effetto:
<System.AttributeUsage(System.AttributeTargets.All)>
Class NewAttribute
Inherits System.Attribute
End Class
[System.AttributeUsage(System.AttributeTargets.All)]
class NewAttribute : System.Attribute { }
Il primo argomento AttributeUsage deve corrispondere a uno o più elementi dell'enumerazione AttributeTargets. Tramite l'operatore OR è possibile collegare più tipi di destinazione, ad esempio:
Imports System
...
<AttributeUsage(AttributeTargets.Property Or AttributeTargets.Field)>
Class NewPropertyOrFieldAttribute
Inherits Attribute
End Class
using System;
...
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
class NewPropertyOrFieldAttribute : Attribute { }
Se l'argomento AllowMultiple è impostato su true, l'attributo risultante può essere applicato più volte a una singola entità, come nell'esempio riportato di seguito:
Imports System
...
<AttributeUsage(AttributeTargets.Class, AllowMultiple:=True)>
Class MultiUseAttr
Inherits Attribute
End Class
<MultiUseAttr(), MultiUseAttr()>
Class Class1
End Class
using System;
...
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
class MultiUseAttr : Attribute { }
[MultiUseAttr]
[MultiUseAttr]
class Class1 { }
[MultiUseAttr, MultiUseAttr]
class Class2 { }
In questo caso, MultiUseAttr può essere applicato ripetutamente poiché AllowMultiple è impostato su true. Entrambi i formati indicati per l'applicazione di più attributi sono validi.
Se Inherited è impostato su false, l'attributo non viene ereditato dalle classi derivate da una classe a cui sono applicati attributi. Di seguito è riportato un esempio.
Imports System
...
<AttributeUsage(AttributeTargets.Class, Inherited:=False)>
Class Attr1
Inherits Attribute
End Class
<Attr1()>
Class BClass
End Class
Class DClass
Inherits BClass
End Class
using System;
...
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
class Attr1 : Attribute { }
[Attr1]
class BClass { }
class DClass : BClass { }
In questo caso, Attr1 non viene applicato a DClass tramite ereditarietà.
Note
AttributeUsage è un attributo a utilizzo singolo, ovvero non può essere applicato più di una volta alla stessa classe. AttributeUsage è un alias per AttributeUsageAttribute.
Per ulteriori informazioni, vedere Accesso agli attributi tramite reflection (C# e Visual Basic).
Esempio
Nell'esempio di codice riportato di seguito vengono illustrati gli effetti degli argomenti Inherited e AllowMultiple sull'attributo AttributeUsage e viene spiegato come è possibile enumerare gli attributi personalizzati applicati a una classe.
Imports System
...
' Create some custom attributes:
<AttributeUsage(System.AttributeTargets.Class, Inherited:=False)>
Class A1
Inherits System.Attribute
End Class
<AttributeUsage(System.AttributeTargets.Class)>
Class A2
Inherits System.Attribute
End Class
<AttributeUsage(System.AttributeTargets.Class, AllowMultiple:=True)>
Class A3
Inherits System.Attribute
End Class
' Apply custom attributes to classes:
<A1(), A2()>
Class BaseClass
End Class
<A3(), A3()>
Class DerivedClass
Inherits BaseClass
End Class
Public Class TestAttributeUsage
Sub Main()
Dim b As New BaseClass
Dim d As New DerivedClass
' Display custom attributes for each class.
Console.WriteLine("Attributes on Base Class:")
Dim attrs() As Object = b.GetType().GetCustomAttributes(True)
For Each attr In attrs
Console.WriteLine(attr)
Next
Console.WriteLine("Attributes on Derived Class:")
attrs = d.GetType().GetCustomAttributes(True)
For Each attr In attrs
Console.WriteLine(attr)
Next
End Sub
End Class
using System;
...
// Create some custom attributes:
[AttributeUsage(System.AttributeTargets.Class, Inherited = false)]
class A1 : System.Attribute { }
[AttributeUsage(System.AttributeTargets.Class)]
class A2 : System.Attribute { }
[AttributeUsage(System.AttributeTargets.Class, AllowMultiple = true)]
class A3 : System.Attribute { }
// Apply custom attributes to classes:
[A1, A2]
class BaseClass { }
[A3, A3]
class DerivedClass : BaseClass { }
public class TestAttributeUsage
{
static void Main()
{
BaseClass b = new BaseClass();
DerivedClass d = new DerivedClass();
// Display custom attributes for each class.
Console.WriteLine("Attributes on Base Class:");
object[] attrs = b.GetType().GetCustomAttributes(true);
foreach (Attribute attr in attrs)
{
Console.WriteLine(attr);
}
Console.WriteLine("Attributes on Derived Class:");
attrs = d.GetType().GetCustomAttributes(true);
foreach (Attribute attr in attrs)
{
Console.WriteLine(attr);
}
}
}
Output di esempio
Attributes on Base Class:
A1
A2
Attributes on Derived Class:
A3
A3
A2
Vedere anche
Riferimenti
Reflection (C# e Visual Basic)
Creazione di attributi personalizzati (C# e Visual Basic)
Accesso agli attributi tramite reflection (C# e Visual Basic)
Concetti
Estensione di metadati mediante attributi