型情報以外のメタデータとして属性も挙げられます。 .NETでは属性を使うことでプログラムに型情報以外の追加的なメタデータを埋め込むことができ、それを実行時に取得・参照することができます。 属性にはコンパイラやランタイムが特別な操作を行うために使用されるものが存在するほか、独自に意味を定義して情報を埋め込むカスタム属性があります。
カスタム属性でメタデータを埋め込み、リフレクションにより埋め込んだメタデータを実行時に取得する
Imports System
Imports System.Reflection
' カスタム属性となるクラス
<AttributeUsage(AttributeTargets.Method, AllowMultiple := True)> _
Public Class AuthorAttribute
Inherits Attribute
Private _name As String
Public Property Name As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
Public Version As String
Public Sub New(ByVal name As String)
Me._name = name
End Sub
End Class
Class Sample
' カスタム属性が設定されたメソッド
<Author("Alice", Version := "1.0")> _
<Author("Bob", Version := "1.1")> _
<Author("Charlie", Version := "1.2")> _
Public Shared Sub TestMethod()
End Sub
Shared Sub Main()
' メソッドの情報を取得する
Dim method As MethodInfo = GetType(Sample).GetMethod("TestMethod")
' メソッドに設定されているカスタム属性を取得して列挙する
For Each attr As AuthorAttribute In method.GetCustomAttributes(GetType(AuthorAttribute), False)
' 属性に設定されている値を表示する
Console.WriteLine("Author: {0}, Version: {1}", attr.Name, attr.Version)
Next
End Sub
End Class
実行結果例
Author: Charlie, Version: 1.2 Author: Bob, Version: 1.1 Author: Alice, Version: 1.0
代表的な属性として、プログラムのバージョン情報を埋め込むための属性(アセンブリのバージョン情報を設定・取得する)や、旧式化されたAPIであることを示すObsolete属性(機能の廃止・非推奨化)、オブジェクトをシリアライズする際の動作を定義する属性(シリアライズの基本)などがあります。
その他、属性について、および属性の使用方法や独自に定義してその情報を取得する方法などについて詳しくは属性とメタデータで個別に解説しています。