Přístup k atributům pomocí Reflexe ion (Visual Basic)

Skutečnost, že můžete definovat vlastní atributy a umístit je do zdrojového kódu, by byla malá hodnota bez nějakého způsobu načtení těchto informací a jednání s nimi. Pomocí reflexe můžete načíst informace definované pomocí vlastních atributů. Metoda klíče je GetCustomAttributes, která vrací pole objektů, které jsou ekvivalenty runtime atributů zdrojového kódu. Tato metoda má několik přetížených verzí. Další informace najdete na webu Attribute.

Specifikace atributu, například:

<Author("P. Ackerman", Version:=1.1)>
Class SampleClass
    ' P. Ackerman's code goes here...
End Class

je koncepčně ekvivalentní tomuto:

Dim anonymousAuthorObject As Author = New Author("P. Ackerman")
anonymousAuthorObject.version = 1.1

Kód se však nespustí, dokud SampleClass se nezotáže na atributy. SampleClass Volání GetCustomAttributes způsobí, že objekt Author bude vytvořen a inicializován jako výše. Pokud třída má další atributy, další objekty atributů jsou vytvořené podobně. GetCustomAttributes pak vrátí Author objekt a všechny ostatní objekty atributů v poli. Pak můžete iterovat přes toto pole, určit, jaké atributy byly použity na základě typu každého prvku pole a extrahovat informace z objektů atributů.

Příklad

Tady je úplný příklad. Vlastní atribut je definován, použit na několik entit a načten prostřednictvím reflexe.

' 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

Viz také