2020年11月23日
川俣晶の縁側ソフトウェアC# コーディング How To total 1567 count

【入門級】属性を自作する

Written By: 川俣 晶連絡先

 属性は自作できるのでしょうか。

 できます。

 簡単です。

 基本的に以下の2つのルールを守るクラスを書くだけです。

  • Attibuteクラスを継承する
  • 名前がAttibuteで終わる

 面倒くさいのは属性を利用する方です。

 基本的に属性はリフレクションのAPIを経由して使います。

 サンプルソースでは、あるクラスに属する全てのプロパティを列挙して、属性の有無を判定しています。

 プロパティの一覧を得るには、型オブジェクトにGetPropertiesメソッドを使います。そこから、GetCustomAttributeメソッドで指定の型の属性を取得します。たいていはnullかどうか調べて有無を調べるだけで済みます。

 もっと複雑な使い方は利用例が多くないので、必要になってから調べても十分でしょう。

罠の数々 §

  • 属性を利用する時の書き方は[My]と[MyAttribute]の2つがある。Attributeは省略してもしなくても良い

参考リンク §

Attribute クラス

System.Reflection 名前空間

CustomAttributeExtensions.GetCustomAttribute メソッド

Type.GetProperties メソッド

 この例はプロパティの属性を調べたが上記のリンクからメソッドの属性やクラスの属性を調べる方法を探してみよう。

リポジトリ §

https://github.com/autumn009/cshowto

MyAttribute §

using System;

using System.Reflection;

class MyAttribute : Attribute

{

}

class Program

{

    public int MyProperty1 { get; set; }

    [My]

    public int MyProperty2 { get; set; }

    static void Main()

    {

        foreach (var item in typeof(Program).GetProperties())

        {

            Console.WriteLine($"{item.Name}は{nameof(MyAttribute)}属性を");

            if (item.GetCustomAttribute(typeof(MyAttribute)) == null)

                Console.WriteLine("持っていません。");

            else

                Console.WriteLine("持っています。");

        }

    }

}

実行結果

MyProperty1はMyAttribute属性を

持っていません。

MyProperty2はMyAttribute属性を

持っています。

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?