C#で属性を作成する

属性を作成する

下記に示すような構造体のプロパティに付加する属性 『FixedText』 を作成していきます。

FixedText属性を持った構造体
public struct Todofuken
{
    /// <summary>
    /// 都道府県コード
    /// </summary>
    [FixedText(Len = 2, PadChar = '0']
    public int Code { set; get; }

    /// <summary>
    /// 都道府県名
    /// </summary>
    [FixedText(Len = 10, PadChar = ' ']
    public string Name { set; get; }
}

1.まずは System.Attribute を継承したクラスを作成します。ここで作成したクラス名が、属性名となります。

public class FixedTextAttribute : System.Attribute
{
}

クラス名に Attribute を付加した場合、Attributeを除いた属性名も有効になります。
つまり、下記の属性名は両方とも有効で、同じ属性を表します。

  • [FixedText]

  • [FixedTextAttribute]

クラス名に Attribute をつけなかった場合、先頭に@をつけた属性名も有効になります。
この場合、下記の属性名が有効になります。

  • [FixedText]

  • [@FixedText]

2.作成する属性がプロパティに対する属性であることを指定します。

AttributeUsage属性を用いて、何に対する属性なのかを指定します。
『何に対する』とは、例えば次のようなものがあります。(これら以外にもあります。)

  • クラスに対する属性

  • 構造体に対する属性

  • フィールドに対する属性

  • プロパティに対する属性

  • メソッドに対する属性

プロパティの場合は、AttributeUsege 属性に AttributeTargets.Property を指定します。

[AttributeUsage(AttributeTargets.Property)]
public class FixedTextAttribute : System.Attribute
{
}

複数の項目に対する属性であることを示す場合は、| で結合します。
例えば、プロパティとフィールドの両方に対する属性であることを指定する場合、次のようになります。

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
public class FixedTextAttribute : System.Attribute
{
}

3.属性に項目を持たせる

FixedText属性は、長さ(Len)と付加文字(PadChar)の2つの項目を持っています。
これらをプロパティとして追加します。

[AttributeUsage(AttributeTargets.Property)]
public class FixedTextAttribute : System.Attribute
{
    public int Len { set; get; }
    public char PadChar { set; get; }
}

以上で、属性の作成は完了です。
次は、クラスや構造体に定義された属性を取得する方法を掲載していきます。