【C#】属性(Attribute)の基礎とカスタム属性の作り方

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] など)でコードの補助や制御が可能
  • カスタム属性を作成して独自のメタデータを付与できる
  • リフレクションを使えば実行時に属性の情報を参照できる

実装の柔軟性を高めたいときや、メタデータを使ったフレームワーク設計には属性の活用が欠かせません。