属性を自作する

属性 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C


属性は自作することもできるようです。

using System;
using System.Reflection;

[AttributeUsage(
    AttributeTargets.Class | AttributeTargets.Method,
    AllowMultiple = true,
    Inherited = false
)]
public class MyAttr : Attribute {
    private string _name;
    public string name {
        get { return _name; }
    }
    public MyAttr(string name) {
        this._name = name;
    }
}

属性を自作するにはAttributeから派生する必要があります。

またAttributeUsage属性を使って属性の情報を設定していきます。

    AttributeTargets.Class | AttributeTargets.Method,

これらはクラス、メソッドに対して使える属性の作成を意味します。

他にも色々指定できるのでまた後ででもAttributeTargets列挙体のページを見て確認しときましょう。

AllowMultipleは同じ属性を複数回設定できるかどうかのフラグで、Inheritedはクラス継承時に属性情報を引き継ぐかどうかを管理するフラグです。用途によって使い分けましょう。

[MyAttr("foo")]
class Class {
    [MyAttr("bar")]
    public static void Hoge() {
    }
}

class Program {
    static void Main() {
        var t = typeof(Class);
        
        AttrNameOutput(t);
        AttrNameOutput(t.GetMethod("Hoge"));
    }
    
    static void AttrNameOutput (MemberInfo info) {
        Attribute[] attrs = Attribute.GetCustomAttributes(info, typeof(MyAttr));
        foreach(Attribute attr in attrs) {
              MyAttr myattr = attr as MyAttr;
              if ( myattr == null ) continue;
            
               Console.WriteLine(myattr.name);
        }
    }
}
$ main
foo
bar

AttrNameOutputの処理で属性として保存されたnameを得る事ができます。

しかしこれどういうケースで使えばいいんですかねぇ。実例が欲しいところです。

この例のような処理であれば単にクラスのstatic変数に持てばいいだけですし。

クラスを超えて処理を共通化したい場合とかに使うとかでしょうか?うーんちょっとわかんないですねぇ。