属性は自作できるのでしょうか。
できます。
簡単です。
基本的に以下の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属性を
持っています。