ここまでで、
- Attribute = メタ情報
- Reflection = それを読む仕組み
という関係が整理できました。
では実際のアプリ開発では、これらはどのように使われるのでしょうか。
基本パターン
すべての応用は、次の流れに集約されます。
基本フロー
- Attributeを定義する
- コードに付ける
- Reflectionで読む
- 振る舞いを変える
宣言 → 解釈 → 実行
例①:特定メソッドの自動実行
[MyTest]
public void Test1() {}
Reflectionで:
if (method.IsDefined(typeof(MyTestAttribute), false))
{
method.Invoke(obj, null);
}
⇒ テストフレームワークの基本形
例②:メタ情報の管理(UI表示)
[DisplayName("ユーザー名")]
public string Name { get; set; }
⇒ UI表示用のラベルをコードから分離できる
例③:動作制御(権限)
[RequiresAdmin]
public void DeleteUser() {}
if (!IsAdmin()) throw;
⇒ 認可ロジック
実務での典型パターン
マッピング
- JSON
- DB
ルーティング
[Route("/users")]
バリデーション
[Required]
DI
[Inject]
⇒ すべて「Attribute + Reflection」
設計の本質
ここが最も重要です。
宣言と処理の分離
- Attribute → 宣言(設定)
- コード → 処理
⇒ ロジックが分離される
可読性と拡張性
- 設定がコードに埋め込まれる
- 後から振る舞いを変えやすい
注意点
使いすぎると見えにくい
- どこで何が起きているか分かりにくい
パフォーマンス
- 起動時にまとめて処理するのが基本
まとめ
AttributeとReflectionは、単なる便利機能ではなく、 宣言的に振る舞いを制御するための仕組み です。
本質
- Attribute → 情報
- Reflection → 解釈
- 実行 → 振る舞い変更
「コードに意味を持たせ、それを実行時に解釈する」
この考え方は、
- ASP.NET
- ORM
- シリアライザ
など、現代の多くのフレームワークの基盤になっています。