Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 v tématu 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 se SampleClass nedotáže na atributy. Volání GetCustomAttributes na SampleClass 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, aplikován na několik objektů a načten prostřednictvím promítání.
' 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