Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il fatto che sia possibile definire attributi personalizzati e inserirli nel codice sorgente sarebbe di poco valore senza alcun modo per recuperare tali informazioni e agire su di esso. Usando la reflection, è possibile recuperare le informazioni definite con attributi personalizzati. Il metodo chiave è GetCustomAttributes
, che restituisce una matrice di oggetti equivalenti in fase di esecuzione degli attributi del codice sorgente. Questo metodo ha diverse versioni sovraccaricate. Per altre informazioni, vedere Attribute.
Una specifica dell'attributo, ad esempio:
<Author("P. Ackerman", Version:=1.1)>
Class SampleClass
' P. Ackerman's code goes here...
End Class
è concettualmente equivalente a questo:
Dim anonymousAuthorObject As Author = New Author("P. Ackerman")
anonymousAuthorObject.version = 1.1
Tuttavia, il codice non viene eseguito fino a quando SampleClass
non viene eseguita una query per gli attributi. La chiamata di GetCustomAttributes
su SampleClass
determina la costruzione e l'inizializzazione di un oggetto Author
come sopra. Se la classe ha altri attributi, gli altri oggetti attributo vengono costruiti in modo analogo.
GetCustomAttributes
restituisce quindi l'oggetto Author
e qualsiasi altro oggetto attributo in una matrice. È quindi possibile eseguire l'iterazione su questa matrice, determinare gli attributi applicati in base al tipo di ogni elemento della matrice ed estrarre informazioni dagli oggetti attributo.
Esempio
Ecco un esempio completo. Un attributo personalizzato viene definito, applicato a diverse entità e recuperato tramite reflection.
' Multiuse attribute
<System.AttributeUsage(System.AttributeTargets.Class Or
System.AttributeTargets.Struct,
AllowMultiple:=True)>
Public Class Author
Inherits System.Attribute
Private name As String
Public version As Double
Sub New(ByVal authorName As String)
name = authorName
' Default value
version = 1.0
End Sub
Function GetName() As String
Return name
End Function
End Class
' Class with the Author attribute
<Author("P. Ackerman")>
Public Class FirstClass
End Class
' Class without the Author attribute
Public Class SecondClass
End Class
' Class with multiple Author attributes.
<Author("P. Ackerman"), Author("R. Koch", Version:=2.0)>
Public Class ThirdClass
End Class
Class TestAuthorAttribute
Sub Main()
PrintAuthorInfo(GetType(FirstClass))
PrintAuthorInfo(GetType(SecondClass))
PrintAuthorInfo(GetType(ThirdClass))
End Sub
Private Shared Sub PrintAuthorInfo(ByVal t As System.Type)
System.Console.WriteLine("Author information for {0}", t)
' Using reflection
Dim attrs() As System.Attribute = System.Attribute.GetCustomAttributes(t)
' Displaying output
For Each attr In attrs
Dim a As Author = CType(attr, Author)
System.Console.WriteLine(" {0}, version {1:f}", a.GetName(), a.version)
Next
End Sub
' Output:
' Author information for FirstClass
' P. Ackerman, version 1.00
' Author information for SecondClass
' Author information for ThirdClass
' R. Koch, version 2.00
' P. Ackerman, version 1.00
End Class