C#で属性を操作する方法

属性は、メタデータ情報をアセンブリに追加できるC#プログラミング言語の強力な機能です。

属性は、実際には、アセンブリ、クラス、メソッド、デリゲート、列挙型、イベント、フィールド、インターフェイス、プロパティ、および構造体のいずれかの要素に関連付けられているオブジェクトです。これらは、宣言型情報を関連付けるために使用できます。リフレクションを使用する必要がある場合は、実行時にそのような情報を後で取得できます。つまり、属性を使用して、必要に応じてリフレクションを使用して実行時にクエリできる追加情報をアセンブリに挿入できます。属性は、その名前と、オプションでパラメーターのリストで構成されます。属性名は属性クラスに対応します。

属性を利用して、アプリケーションのビジネスオブジェクトを検証できます。属性には、組み込み属性とカスタム属性の2種類があります。前者は.Netフレームワークの一部として利用できますが、後者はSystem.Attributeクラスからクラスを派生させることで実装できます。MSDNは、「属性は、宣言に指定される追加の宣言情報の一部です」と述べています。

それでは、いくつかのコードを見てみましょう。Obsolete属性を使用して、メソッドを廃止として示すことができます。これは、不要になったため、または他の代替手段がある可能性があるため、使用しないでください。次のコードスニペットは、メソッド宣言の上でObsolete属性を使用する方法を示しています。

[Obsolete("This method is obsolete...")]

        public static void DoSomeWork()

        {

            //Some code

        }

コードでこのメソッドを使用してプログラムをコンパイルすると、Visual StudioIDEの出力ウィンドウに警告が表示されます。したがって、必要に応じてこの警告を無視できます。では、開発者にこの方法をまったく使用させたくない場合はどうでしょうか。そうですね、Obsolete属性を宣言するときに、2番目のパラメーター(ただしオプション)を使用できます。これは、DoSomeWork()メソッドの修正バージョンです。今回はブールパラメータの使用法に注意してください。

[Obsolete("This method is obsolete...", true)]

        public static void DoSomeWork()

        {

                       //Some code

        }                                                                                                                        

今回、2番目のオプションパラメータとして「true」を渡してプログラムをコンパイルすると、コードはまったくコンパイルされません。それがあなたのやりたかったことですよね?

カスタム属性

このセクションでは、カスタム属性を実装する方法について説明します。カスタム属性は、System.Attributeクラスを継承するクラスです。したがって、カスタム属性クラスを実装するには、以下に示すように、新しいクラスを作成し、System.Attributeクラスから派生させます。

using System;

public class CustomAttribute : Attribute

{

}

カスタム属性の使用を制御するために、AttributeUsageクラスを利用できます。このクラスには、ValidOn、AllowMultiple、わずかのようなプロパティが含まれており、これらを使用してカスタム属性の使用を制御できます。

次のコードスニペットは、カスタム属性クラスの変更バージョンを示しています。文字列を引数として受け取り、それをクラスのプライベート文字列メンバーに割り当てるコンストラクターの使用法に注意してください。これは説明のみを目的としています。

[AttributeUsage(AttributeTargets.All)]

    public class CustomAttribute : Attribute

    {

        private string text;

        public CustomAttribute(string text)

        {

            this.Text = text;

        }

        public string Text

        {

            get

            {

                return this.text;

            }

            set

            {

                this.text = value;

            }

        }

    }

カスタム属性を適用する属性ターゲットを指定することもできます。これがあなたがそれをする方法です。

[AttributeUsage(AttributeTargets.Class |

AttributeTargets.Constructor |

AttributeTargets.Field |

AttributeTargets.Method |

AttributeTargets.Property,

AllowMultiple = true)]

    public class CustomAttribute : Attribute

    {

        private string text;

        public CustomAttribute(string text)

        {

            this.Text = text;

        }

        public string Text

        {

            get

            {

                return this.text;

            }

            set

            {

                this.text = value;

            }

        }

    }

これで、リフレクションを使用して、次のコードスニペットを使用して特定のオブジェクトに適用されるすべての属性を表示できます。

MemberInfo memberInfo = typeof(CustomAttribute);

object[] attributes = memberInfo.GetCustomAttributes(true);

for (int i = 0, j = attributes.Length; i < j; i++)

  {

     Console.WriteLine(attributes[i]);

  }

ここで、カスタム属性を適用する次のクラスについて考えてみます。

[CustomAttribute("Hello World...")]

public class SomeClass

{

}

カスタム属性がどのように使用され、テキストが引数として渡されたかに注意してください。次のコードスニペットは、Textプロパティのコンテンツを印刷する方法を示しています。

MemberInfo memberInfo = typeof(SomeClass);

object[] attributes = memberInfo.GetCustomAttributes(true);

foreach (object attribute in attributes)

{

CustomAttribute customAttribute = attribute as CustomAttribute;

if (customAttribute != null)

Console.WriteLine("Text = {0}", customAttribute.Text);

else

Console.WriteLine();

}