属性に格納されている情報の取得Retrieving Information Stored in Attributes

カスタム属性の取得は簡単なプロセスです。Retrieving a custom attribute is a simple process. まず、取得する属性のインスタンスを宣言します。First, declare an instance of the attribute you want to retrieve. 次に、Attribute.GetCustomAttribute メソッドを使用して、取得する属性の値に新しい属性を初期化します。Then, use the Attribute.GetCustomAttribute method to initialize the new attribute to the value of the attribute you want to retrieve. 新しい属性が初期化されたら、そのプロパティを使用して値を取得できるようになります。Once the new attribute is initialized, you simply use its properties to get the values.

重要

このトピックでは、実行コンテキストに読み込まれるコードのカスタム属性を取得する方法について説明します。This topic describes how to retrieve attributes for code loaded into the execution context. リフレクションのみのコンテキストに読み込まれたコードの属性を取得するには、「方法: リフレクションのみのコンテキストにアセンブリを読み込む」で説明されているように、CustomAttributeData クラスを使用する必要があります。リフレクションのみのコンテキストにアセンブリを読み込む」を参照してください。To retrieve attributes for code loaded into the reflection-only context, you must use the CustomAttributeData class, as shown in How to: Load Assemblies into the Reflection-Only Context.

このセクションでは、以下の属性の取得方法について説明します。This section describes the following ways to retrieve attributes:

属性の単一のインスタンスを取得するRetrieving a Single Instance of an Attribute

次の例では、(前のセクションで説明した) DeveloperAttribute がクラス レベルで MainApp クラスに適用されます。In the following example, the DeveloperAttribute (described in the previous section) is applied to the MainApp class on the class level. GetAttribute メソッドは GetCustomAttribute を使用して、クラス レベルで DeveloperAttribute に格納されている値を取得してからコンソールに表示します。The GetAttribute method uses GetCustomAttribute to retrieve the values stored in DeveloperAttribute on the class level before displaying them to the console.

using namespace System;
using namespace System::Reflection;
using namespace CustomCodeAttributes;

[Developer("Joan Smith", "42", Reviewed = true)]
ref class MainApp
{
public:
    static void Main()
    {
        // Call function to get and display the attribute.
        GetAttribute(MainApp::typeid);
    }

    static void GetAttribute(Type^ t)
    {
        // Get instance of the attribute.
        DeveloperAttribute^ MyAttribute =
            (DeveloperAttribute^) Attribute::GetCustomAttribute(t, DeveloperAttribute::typeid);

        if (MyAttribute == nullptr)
        {
            Console::WriteLine("The attribute was not found.");
        }
        else
        {
            // Get the Name value.
            Console::WriteLine("The Name Attribute is: {0}." , MyAttribute->Name);
            // Get the Level value.
            Console::WriteLine("The Level Attribute is: {0}." , MyAttribute->Level);
            // Get the Reviewed value.
            Console::WriteLine("The Reviewed Attribute is: {0}." , MyAttribute->Reviewed);
        }
    }
};
using System;
using System.Reflection;
using CustomCodeAttributes;

[Developer("Joan Smith", "42", Reviewed = true)]
class MainApp
{
    public static void Main()
    {
        // Call function to get and display the attribute.
        GetAttribute(typeof(MainApp));
    }

    public static void GetAttribute(Type t)
    {
        // Get instance of the attribute.
        DeveloperAttribute MyAttribute =
            (DeveloperAttribute) Attribute.GetCustomAttribute(t, typeof (DeveloperAttribute));

        if (MyAttribute == null)
        {
            Console.WriteLine("The attribute was not found.");
        }
        else
        {
            // Get the Name value.
            Console.WriteLine("The Name Attribute is: {0}." , MyAttribute.Name);
            // Get the Level value.
            Console.WriteLine("The Level Attribute is: {0}." , MyAttribute.Level);
            // Get the Reviewed value.
            Console.WriteLine("The Reviewed Attribute is: {0}." , MyAttribute.Reviewed);
        }
    }
}
Imports System
Imports System.Reflection
Imports CustomCodeAttributes

<Developer("Joan Smith", "42", Reviewed := True)>
Class MainApp
    Public Shared Sub Main()
        ' Call function to get and display the attribute.
        GetAttribute(GetType(MainApp))
    End Sub

    Public Shared Sub GetAttribute(t As Type)
        ' Get instance of the attribute.
        Dim MyAttribute As DeveloperAttribute =
            CType(Attribute.GetCustomAttribute(t, GetType(DeveloperAttribute)), DeveloperAttribute)

        If MyAttribute Is Nothing Then
            Console.WriteLine("The attribute was not found.")
        Else
            ' Get the Name value.
            Console.WriteLine("The Name Attribute is: {0}." , MyAttribute.Name)
            ' Get the Level value.
            Console.WriteLine("The Level Attribute is: {0}." , MyAttribute.Level)
            ' Get the Reviewed value.
            Console.WriteLine("The Reviewed Attribute is: {0}." , MyAttribute.Reviewed)
        End If
    End Sub
End Class

このプログラムを実行すると、次のテキストが表示されます。This program displays the following text when executed.

The Name Attribute is: Joan Smith.  
The Level Attribute is: 42.  
The Reviewed Attribute is: True.  

属性が見つからない場合、GetCustomAttribute メソッドは MyAttribute を null 値に初期化します。If the attribute is not found, the GetCustomAttribute method initializes MyAttribute to a null value. この例では、そのようなインスタンスの MyAttribute を確認し、属性が見つからない場合はユーザーに通知します。This example checks MyAttribute for such an instance and notifies the user if no attribute is found. クラス スコープ内に DeveloperAttribute 見つからない場合は、次のメッセージがコンソールに表示されます。If the DeveloperAttribute is not found in the class scope, the following message displays to the console.

The attribute was not found.   

この例では、属性の定義が現在の名前空間にあると仮定しています。This example assumes that the attribute definition is in the current namespace. 属性の定義が現在の名前空間にない場合は、その定義が存在する名前空間を忘れずにインポートしてください。Remember to import the namespace in which the attribute definition resides if it is not in the current namespace.

同じスコープに適用された属性の複数のインスタンスを取得するRetrieving Multiple Instances of an Attribute Applied to the Same Scope

前の例では、検査するクラスと検索する特定の属性が GetCustomAttribute に渡されます。In the previous example, the class to inspect and the specific attribute to find are passed to GetCustomAttribute. このコードは、クラス レベルで属性のインスタンスが 1 つのみ適用される場合に動作します。That code works well if only one instance of an attribute is applied on the class level. ただし、属性のインスタンスが同じクラス レベルに複数適用されている場合、GetCustomAttribute メソッドはすべての情報を取得しません。However, if multiple instances of an attribute are applied on the same class level, the GetCustomAttribute method does not retrieve all the information. 同じ属性のインスタンスが同じスコープに複数適用されている場合、Attribute.GetCustomAttributes を使用して、属性のすべてのインスタンスを配列に配置することができます。In cases where multiple instances of the same attribute are applied to the same scope, you can use Attribute.GetCustomAttributes to place all instances of an attribute into an array. たとえば、同じクラスのクラス レベルで 2 インスタンスの DeveloperAttribute が適用された場合、両方の属性にある情報を表示するように GetAttribute メソッドを変更できます。For example, if two instances of DeveloperAttribute are applied on the class level of the same class, the GetAttribute method can be modified to display the information found in both attributes. ただし、同じレベルで複数の属性を適用するには、AttributeUsageAttributeAllowMultiple プロパティを true に設定して属性を定義する必要があります。Remember, to apply multiple attributes on the same level, the attribute must be defined with the AllowMultiple property set to true in the AttributeUsageAttribute.

次のコード例は、GetCustomAttributes メソッドを使用して、指定されたクラスで DeveloperAttribute のすべてのインスタンスを参照する配列を作成する方法を示しています。The following code example shows how to use the GetCustomAttributes method to create an array that references all instances of DeveloperAttribute in any given class. すべての属性の値がコンソールに表示されます。The values of all attributes are then displayed to the console.

public:
    static void GetAttribute(Type^ t)
    {
        array<DeveloperAttribute^>^ MyAttributes =
            (array<DeveloperAttribute^>^) Attribute::GetCustomAttributes(t, DeveloperAttribute::typeid);

        if (MyAttributes->Length == 0)
        {
            Console::WriteLine("The attribute was not found.");
        }
        else
        {
            for (int i = 0 ; i < MyAttributes->Length; i++)
            {
                // Get the Name value.
                Console::WriteLine("The Name Attribute is: {0}." , MyAttributes[i]->Name);
                // Get the Level value.
                Console::WriteLine("The Level Attribute is: {0}." , MyAttributes[i]->Level);
                // Get the Reviewed value.
                Console::WriteLine("The Reviewed Attribute is: {0}.", MyAttributes[i]->Reviewed);
            }
        }
    }
public static void GetAttribute(Type t)
{
    DeveloperAttribute[] MyAttributes =
        (DeveloperAttribute[]) Attribute.GetCustomAttributes(t, typeof (DeveloperAttribute));

    if (MyAttributes.Length == 0)
    {
        Console.WriteLine("The attribute was not found.");
    }
    else
    {
        for (int i = 0 ; i < MyAttributes.Length ; i++)
        {
            // Get the Name value.
            Console.WriteLine("The Name Attribute is: {0}." , MyAttributes[i].Name);
            // Get the Level value.
            Console.WriteLine("The Level Attribute is: {0}." , MyAttributes[i].Level);
            // Get the Reviewed value.
            Console.WriteLine("The Reviewed Attribute is: {0}.", MyAttributes[i].Reviewed);
        }
    }
}
Public Shared Sub GetAttribute(t As Type)
    Dim MyAttributes() As DeveloperAttribute =
        CType(Attribute.GetCustomAttributes(t, GetType(DeveloperAttribute)), DeveloperAttribute())

    If MyAttributes.Length = 0 Then
        Console.WriteLine("The attribute was not found.")
    Else
        For i As Integer = 0 To MyAttributes.Length - 1
            ' Get the Name value.
            Console.WriteLine("The Name Attribute is: {0}." , MyAttributes(i).Name)
            ' Get the Level value.
            Console.WriteLine("The Level Attribute is: {0}." , MyAttributes(i).Level)
            ' Get the Reviewed value.
            Console.WriteLine("The Reviewed Attribute is: {0}.", MyAttributes(i).Reviewed)
        Next i
    End If
End Sub

このコードでは、属性が見つからない場合、ユーザーに警告されます。If no attributes are found, this code alerts the user. それ以外の場合は、DeveloperAttribute の両方のインスタンスに含まれる情報が表示されます。Otherwise, the information contained in both instances of DeveloperAttribute is displayed.

異なるスコープに適用された属性の複数のインスタンスを取得するRetrieving Multiple Instances of an Attribute Applied to Different Scopes

GetCustomAttributes メソッドと GetCustomAttribute メソッドは、クラス全体を検索し、そのクラスに含まれる属性のすべてのインスタンスを返す処理を行いません。The GetCustomAttributes and GetCustomAttribute methods do not search an entire class and return all instances of an attribute in that class. 代わりに、指定されたメソッドまたはメンバーを一度に 1 つのみ検索します。Rather, they search only one specified method or member at a time. 各メンバーに同じ属性が適用されているクラスがあり、それらのメンバーに適用されているすべての属性の値を取得する場合は、すべてのメソッドまたはメンバーを個別に GetCustomAttributes および GetCustomAttribute に渡す必要があります。If you have a class with the same attribute applied to every member and you want to retrieve the values in all the attributes applied to those members, you must supply every method or member individually to GetCustomAttributes and GetCustomAttribute.

次のコード例では、クラスをパラメーターとして受け取り、クラス レベルとそのクラスの個々のメソッドごとに DeveloperAttribute (以前に定義) を検索します。The following code example takes a class as a parameter and searches for the DeveloperAttribute (defined previously) on the class level and on every individual method of that class.

public:
    static void GetAttribute(Type^ t)
    {
        DeveloperAttribute^ att;

        // Get the class-level attributes.

        // Put the instance of the attribute on the class level in the att object.
        att = (DeveloperAttribute^) Attribute::GetCustomAttribute (t, DeveloperAttribute::typeid);

        if (att == nullptr)
        {
            Console::WriteLine("No attribute in class {0}.\n", t->ToString());
        }
        else
        {
            Console::WriteLine("The Name Attribute on the class level is: {0}.", att->Name);
            Console::WriteLine("The Level Attribute on the class level is: {0}.", att->Level);
            Console::WriteLine("The Reviewed Attribute on the class level is: {0}.\n", att->Reviewed);
        }

        // Get the method-level attributes.

        // Get all methods in this class, and put them
        // in an array of System.Reflection.MemberInfo objects.
        array<MemberInfo^>^ MyMemberInfo = t->GetMethods();

        // Loop through all methods in this class that are in the
        // MyMemberInfo array.
        for (int i = 0; i < MyMemberInfo->Length; i++)
        {
            att = (DeveloperAttribute^) Attribute::GetCustomAttribute(MyMemberInfo[i], DeveloperAttribute::typeid);
            if (att == nullptr)
            {
                Console::WriteLine("No attribute in member function {0}.\n" , MyMemberInfo[i]->ToString());
            }
            else
            {
                Console::WriteLine("The Name Attribute for the {0} member is: {1}.",
                    MyMemberInfo[i]->ToString(), att->Name);
                Console::WriteLine("The Level Attribute for the {0} member is: {1}.",
                    MyMemberInfo[i]->ToString(), att->Level);
                Console::WriteLine("The Reviewed Attribute for the {0} member is: {1}.\n",
                    MyMemberInfo[i]->ToString(), att->Reviewed);
            }
        }
    }
public static void GetAttribute(Type t)
{
    DeveloperAttribute att;

    // Get the class-level attributes.

    // Put the instance of the attribute on the class level in the att object.
    att = (DeveloperAttribute) Attribute.GetCustomAttribute (t, typeof (DeveloperAttribute));

    if (att == null)
    {
        Console.WriteLine("No attribute in class {0}.\n", t.ToString());
    }
    else
    {
        Console.WriteLine("The Name Attribute on the class level is: {0}.", att.Name);
        Console.WriteLine("The Level Attribute on the class level is: {0}.", att.Level);
        Console.WriteLine("The Reviewed Attribute on the class level is: {0}.\n", att.Reviewed);
    }

    // Get the method-level attributes.

    // Get all methods in this class, and put them
    // in an array of System.Reflection.MemberInfo objects.
    MemberInfo[] MyMemberInfo = t.GetMethods();

    // Loop through all methods in this class that are in the
    // MyMemberInfo array.
    for (int i = 0; i < MyMemberInfo.Length; i++)
    {
        att = (DeveloperAttribute) Attribute.GetCustomAttribute(MyMemberInfo[i], typeof (DeveloperAttribute));
        if (att == null)
        {
            Console.WriteLine("No attribute in member function {0}.\n" , MyMemberInfo[i].ToString());
        }
        else
        {
            Console.WriteLine("The Name Attribute for the {0} member is: {1}.",
                MyMemberInfo[i].ToString(), att.Name);
            Console.WriteLine("The Level Attribute for the {0} member is: {1}.",
                MyMemberInfo[i].ToString(), att.Level);
            Console.WriteLine("The Reviewed Attribute for the {0} member is: {1}.\n",
                MyMemberInfo[i].ToString(), att.Reviewed);
        }
    }
}
Public Shared Sub GetAttribute(t As Type)
    Dim att As DeveloperAttribute

    ' Get the class-level attributes.

    ' Put the instance of the attribute on the class level in the att object.
    att = CType(Attribute.GetCustomAttribute(t, GetType(DeveloperAttribute)), DeveloperAttribute)

    If att Is Nothing
        Console.WriteLine("No attribute in class {0}.\n", t.ToString())
    Else
        Console.WriteLine("The Name Attribute on the class level is: {0}.", att.Name)
        Console.WriteLine("The Level Attribute on the class level is: {0}.", att.Level)
        Console.WriteLine("The Reviewed Attribute on the class level is: {0}.\n", att.Reviewed)
    End If

    ' Get the method-level attributes.

    ' Get all methods in this class, and put them
    ' in an array of System.Reflection.MemberInfo objects.
    Dim MyMemberInfo() As MemberInfo = t.GetMethods()

    ' Loop through all methods in this class that are in the
    ' MyMemberInfo array.
    For i As Integer = 0 To MyMemberInfo.Length - 1
        att = CType(Attribute.GetCustomAttribute(MyMemberInfo(i), _
            GetType(DeveloperAttribute)), DeveloperAttribute)
        If att Is Nothing Then
            Console.WriteLine("No attribute in member function {0}.\n" , MyMemberInfo(i).ToString())
        Else
            Console.WriteLine("The Name Attribute for the {0} member is: {1}.",
                MyMemberInfo(i).ToString(), att.Name)
            Console.WriteLine("The Level Attribute for the {0} member is: {1}.",
                MyMemberInfo(i).ToString(), att.Level)
            Console.WriteLine("The Reviewed Attribute for the {0} member is: {1}.\n",
                MyMemberInfo(i).ToString(), att.Reviewed)
        End If
    Next
End Sub

メソッド レベルまたはクラス レベルで DeveloperAttribute のインスタンスが見つからない場合、GetAttribute メソッドは属性が見つからなかったことをユーザーに通知し、その属性を含まないメソッドまたはクラスの名前を表示します。If no instances of the DeveloperAttribute are found on the method level or class level, the GetAttribute method notifies the user that no attributes were found and displays the name of the method or class that does not contain the attribute. 属性が見つかると、NameLevel、および Reviewed フィールドがコンソールに表示されます。If an attribute is found, the Name, Level, and Reviewed fields are displayed to the console.

Type クラスのメンバーを使用して、渡されたクラスの個々のメソッドとメンバーを取得できます。You can use the members of the Type class to get the individual methods and members in the passed class. この例では、まず Type オブジェクトに対してクエリを実行して、クラス レベルの属性情報を取得します。This example first queries the Type object to get attribute information for the class level. 次に、Type.GetMethods を使用してすべてのメソッドのインスタンスを System.Reflection.MemberInfo オブジェクトの配列に配置し、メソッド レベルの属性情報を取得します。Next, it uses Type.GetMethods to place instances of all methods into an array of System.Reflection.MemberInfo objects to retrieve attribute information for the method level. Type.GetProperties メソッドを使用して、プロパティ レベルまたは Type.GetConstructors で属性を確認したり、コンストラクター レベルで属性を確認したりすることもできます。You can also use the Type.GetProperties method to check for attributes on the property level or Type.GetConstructors to check for attributes on the constructor level.

関連項目See also