Condividi tramite


Accesso agli attributi tramite reflection (Visual Basic)

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

Vedere anche