C# には「属性(Attribute)」と呼ばれる仕組みがあり、クラスやメソッドなどにメタデータを付加することができます。属性を利用すると、ライブラリやフレームワークに追加情報を伝えたり、リフレクションを使って実行時に動的な処理を行ったりできます。本記事では属性の基礎と、自作できる「カスタム属性」の作り方を解説します。
属性(Attribute)とは?
属性は [...]
の形でクラス・メソッド・プロパティなどに付与できます。代表的なものに [Obsolete]
や [Serializable]
があります。
using System;
class Program
{
[Obsolete("このメソッドは非推奨です。新しいメソッドを使ってください。")]
static void OldMethod()
{
Console.WriteLine("古い処理");
}
static void Main()
{
OldMethod(); // コンパイル時に警告が出る
}
}
この例では [Obsolete]
属性を使い、古いメソッドの利用に警告を出しています。
属性の仕組み
属性は System.Attribute
クラスを継承したクラスとして実装されます。属性を付与すると、アセンブリにそのメタデータが埋め込まれ、リフレクションで取得可能になります。
カスタム属性の作り方
独自の属性を作るには Attribute
を継承したクラスを定義します。名前には「Attribute」を付けるのが慣例です。
using System;
// カスタム属性の定義
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorAttribute : Attribute
{
public string Name { get; }
public string Version { get; }
public AuthorAttribute(string name, string version)
{
Name = name;
Version = version;
}
}
// 属性を利用するクラス
[Author("Taro", "1.0")]
class Sample
{
[Author("Hanako", "1.1")]
public void Run()
{
Console.WriteLine("処理を実行");
}
}
この例では [Author]
というカスタム属性を作り、クラスやメソッドに開発者情報を付与しています。
リフレクションで属性を取得する
実行時に属性を参照するにはリフレクションを使います。
using System;
using System.Reflection;
class Program
{
static void Main()
{
var type = typeof(Sample);
// クラスに付与された属性を取得
var classAttr = (AuthorAttribute)Attribute.GetCustomAttribute(type, typeof(AuthorAttribute));
Console.WriteLine($"クラスのAuthor: {classAttr.Name}, バージョン: {classAttr.Version}");
// メソッドに付与された属性を取得
var method = type.GetMethod("Run");
var methodAttr = (AuthorAttribute)Attribute.GetCustomAttribute(method, typeof(AuthorAttribute));
Console.WriteLine($"メソッドのAuthor: {methodAttr.Name}, バージョン: {methodAttr.Version}");
}
}
まとめ
C# の属性はクラスやメソッドにメタデータを付与できる便利な仕組みです。
- 標準属性(
[Obsolete]
,[Serializable]
など)でコードの補助や制御が可能 - カスタム属性を作成して独自のメタデータを付与できる
- リフレクションを使えば実行時に属性の情報を参照できる
実装の柔軟性を高めたいときや、メタデータを使ったフレームワーク設計には属性の活用が欠かせません。