Attributeを理解した次に出てくるのが、Reflectionです。 Attributeは単なるメタ情報ですが、それを「読む仕組み」がなければ意味を持ちません。その役割を担うのがReflectionです。
Reflectionとは何か
Reflectionは一言で言うと、 実行時に型情報やメタ情報を調べる仕組み です。
Attributeとの関係
Attributeはコードに付けられた「情報」です。しかし、それだけでは何も起きません。
[Obsolete]
class MyClass
{
}
この状態では、実行時には何も特別な処理は起きません。
そこで使われるのがReflectionです。
var type = typeof(MyClass);
var attrs = type.GetCustomAttributes(false);
これによって、Attributeを取得し、プログラムの中で扱うことができます。
Reflectionでできること
Reflectionを使うと、次のようなことができます。
型情報の取得
- クラス名
- メソッド一覧
- プロパティ一覧
Attributeの取得
method.IsDefined(typeof(MyAttribute), false)
動的な呼び出し
method.Invoke(obj, null);
コンパイル時ではなく、実行時に判断できる
なぜReflectionが必要なのか
Attributeは情報を付けるだけです。
Reflectionがその情報を読み取ることで初めて意味が生まれる
よくある用途
フレームワーク内部
- ASP.NET Core(Route)
- Entity Framework
- JSONシリアライザ
自作処理
- 特定Attribute付きメソッドの自動実行
- 設定値の読み取り
- 動作の切り替え
「reference」との違い
混同しやすい用語として「reference」がありますが、これは単なる参照です。
object obj = new MyClass();
これはReflectionとは無関係
注意点
パフォーマンス
Reflectionは遅いです。
- 毎回呼ばない
- キャッシュする
型安全でない
method.Invoke(...)
コンパイル時チェックが効かない
まとめ
Reflectionは、実行時に型やAttributeなどのメタ情報を調べるための仕組みです。
Attributeが「情報を付ける」役割なら、 Reflectionは「その情報を読む」役割 です。
この2つはセットで初めて意味を持ちます。