Uzyskiwanie dostępu do atrybutów przy użyciu Emocje ion (Visual Basic)

Fakt, że można zdefiniować atrybuty niestandardowe i umieścić je w kodzie źródłowym, będzie miał niewielką wartość bez konieczności pobierania tych informacji i działania na nim. Przy użyciu odbicia można pobrać informacje zdefiniowane za pomocą atrybutów niestandardowych. Metoda klucza to GetCustomAttributes, która zwraca tablicę obiektów, które są odpowiednikami czasu wykonywania atrybutów kodu źródłowego. Ta metoda ma kilka przeciążonych wersji. Aby uzyskać więcej informacji, zobacz Attribute.

Specyfikacja atrybutu, taka jak:

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

jest koncepcyjnie odpowiednikiem tego:

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

Jednak kod nie jest wykonywany, dopóki SampleClass nie zostanie wykonane zapytanie o atrybuty. Wywołanie metody powoduje AuthorSampleClass konstruowanie GetCustomAttributes i inicjowanie obiektu, jak pokazano powyżej. Jeśli klasa ma inne atrybuty, inne obiekty atrybutów są konstruowane podobnie. GetCustomAttributes następnie zwraca Author obiekt i wszystkie inne obiekty atrybutów w tablicy. Następnie można iterować na tej tablicy, określić, jakie atrybuty zostały zastosowane na podstawie typu każdego elementu tablicy i wyodrębnić informacje z obiektów atrybutów.

Przykład

Oto kompletny przykład. Atrybut niestandardowy jest definiowany, stosowany do kilku jednostek i pobierany za pośrednictwem odbicia.

' 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

Zobacz też