Imports System.Attribute

Module CustomAttributes

    <AttributeUsage(AttributeTargets.Class)> _
	Class CustomAttribute
		Inherits System.Attribute

		'Deklaracja dwóch prywatnych pól w celu umieszczenia wartości właściwości.
		Private msg As String

		'Konstruktor Sub New to jedyny sposób ustawienia właściwości.
		Public Sub New(ByVal _message As String)
			msg = _message
		End Sub
		Public Overridable ReadOnly Property Message() As String
			Get
				Return msg
		End Property
	End Class

	' Zastosowanie własnego atrybutu dla tej klasy.
	<Custom("Hello World!")> _
	Class MessageClass
		' Wiadomość
		Private msg As String
		Sub New()
			Dim Attr As Attribute
			Dim CustAttr As CustomAttribute
			Attr = GetCustomAttribute(GetType(MessageClass), _
								GetType(CustomAttribute), False)
			CustAttr = CType(Attr, CustomAttribute)
			If CustAttr Is Nothing Then
				msg = "Nie odnaleziono atrybutu."
			Else
				'Uzyskanie etykiety i wartości własnego atrybutu.
				msg = "Etykieta atrybutu to: " & CustAttr.Message
			End If
		End Sub
		Sub Message()
			Console.WriteLine(msg)
		End Sub
	End Class

	Sub Main()
		Dim m As New MessageClass()
		m.Message()
	End Sub

End Module
