カスタム属性へのアクセスAccessing Custom Attributes

属性がプログラム要素に関連付けられると、リフレクションを使用して、その存在と値をクエリすることができます。After attributes have been associated with program elements, reflection can be used to query their existence and values. .NET Framework バージョン 1.0 および 1.1 では、カスタム属性は実行コンテキストで検証されます。In the .NET Framework version 1.0 and 1.1, custom attributes are examined in the execution context. .NET Framework バージョン 2.0 では、新しい読み込みコンテキスト (リフレクションのみのコンテキスト) が提供されます。これを使用して、実行のために読み込むことができないコードを検証できます。The .NET Framework version 2.0 provides a new load context, the reflection-only context, which can be used to examine code that cannot be loaded for execution.

リフレクションのみのコンテキストThe Reflection-Only Context

リフレクションのみのコンテキストに読み込まれたコードは、実行することができません。Code loaded into the reflection-only context cannot be executed. つまり、コンストラクターを実行する必要があるため、カスタム属性のインスタンスは作成できないということです。This means that instances of custom attributes cannot be created, because that would require executing their constructors. リフレクションのみのコンテキストにカスタム属性を読み込み、検証するには、CustomAttributeData クラスを使用します。To load and examine custom attributes in the reflection-only context, use the CustomAttributeData class. 静的な CustomAttributeData.GetCustomAttributes メソッドの適切なオーバーロードを使用して、このクラスのインスタンスを取得できます。You can obtain instances of this class by using the appropriate overload of the static CustomAttributeData.GetCustomAttributes method. 方法:リフレクションのみのコンテキストにアセンブリを読み込む」を参照してください。See How to: Load Assemblies into the Reflection-Only Context.

実行コンテキストThe Execution Context

実行コンテキストの属性をクエリする主なリフレクション メソッドは、MemberInfo.GetCustomAttributesAttribute.GetCustomAttributes です。The main reflection methods to query attributes in the execution context are MemberInfo.GetCustomAttributes and Attribute.GetCustomAttributes.

カスタム属性のアクセシビリティは、添付されているアセンブリに関してチェックされます。The accessibility of a custom attribute is checked with respect to the assembly in which it is attached. これは、カスタム属性が添付されているアセンブリの型のメソッドが、カスタム属性のコンストラクターを呼び出すことができるかどうかをチェックするのと同じです。This is equivalent to checking whether a method on a type in the assembly in which the custom attribute is attached can call the constructor of the custom attribute.

Assembly.GetCustomAttributes(Boolean) などのメソッドは、型引数の可視性とアクセシビリティをチェックします。Methods such as Assembly.GetCustomAttributes(Boolean) check the visibility and accessibility of the type argument. ユーザー定義型を含むアセンブリのコードのみが、GetCustomAttributes を使用する型のカスタム属性を取得することができます。Only code in the assembly that contains the user-defined type can retrieve a custom attribute of that type using GetCustomAttributes.

次の C# の例は、一般的なカスタム属性の設計パターンです。The following C# example is a typical custom attribute design pattern. これは、ランタイムのカスタム属性のリフレクション モデルを示しています。It illustrates the runtime custom attribute reflection model.

System.DLL  
public class DescriptionAttribute : Attribute  
{  
}  
  
System.Web.DLL  
internal class MyDescriptionAttribute : DescriptionAttribute  
{  
}  
  
public class LocalizationExtenderProvider  
{  
    [MyDescriptionAttribute(...)]  
    public CultureInfo GetLanguage(...)  
    {  
    }  
}  

このランタイムで GetLanguage メソッドに添付されている公開のカスタム属性の型 DescriptionAttribute のカスタム属性を取得しようとしている場合、次のアクションが実行されます。If the runtime is attempting to retrieve the custom attributes for the public custom attribute type DescriptionAttribute attached to the GetLanguage method, it performs the following actions:

  1. ランタイムは、Type.GetCustomAttributes(Type type) の型引数 DescriptionAttribute が公開であることをチェックするため、表示およびアクセスすることができます。The runtime checks that the type argument DescriptionAttribute to Type.GetCustomAttributes(Type type) is public, and therefore is visible and accessible.

  2. ランタイムは、DescriptionAttribute から派生するユーザー定義型 MyDescriptionAttributeSystem.Web.DLL アセンブリ内で表示およびアクセスできることをチェックします。これは、メソッド GetLanguage() に添付されている場所です。The runtime checks that the user-defined type MyDescriptionAttribute that is derived from DescriptionAttribute is visible and accessible within the System.Web.DLL assembly, where it is attached to the method GetLanguage().

  3. ランタイムは、MyDescriptionAttribute のコンストラクターが、System.Web.DLL アセンブリ内で表示およびアクセスできることをチェックします。The runtime checks that the constructor of MyDescriptionAttribute is visible and accessible within the System.Web.DLL assembly.

  4. ランタイムは、カスタム属性のパラメーターを使って MyDescriptionAttribute のコンストラクターを呼び出し、呼び出し元に新しいオブジェクトを返します。The runtime calls the constructor of MyDescriptionAttribute with the custom attribute parameters and returns the new object to the caller.

カスタム属性のリフレクション モデルは、型が定義されているアセンブリの外にあるユーザー定義型のインスタンスをリークする可能性があります。The custom attribute reflection model could leak instances of user-defined types outside the assembly in which the type is defined. これは、RuntimeMethodInfo オブジェクトの配列を返す Type.GetMethods など、ユーザー定義型のインスタンスを返すランタイム システム ライブラリのメンバーと同様です。This is no different from the members in the runtime system library that return instances of user-defined types, such as Type.GetMethods returning an array of RuntimeMethodInfo objects. クライアントがユーザー定義のカスタム属性の型に関する情報を検出できないようにするには、型のメンバーを非公開に定義します。To prevent a client from discovering information about a user-defined custom attribute type, define the type's members to be nonpublic.

次の例では、カスタム属性にアクセスできるリフレクションを使用する基本的な方法を示します。The following example demonstrates the basic way of using reflection to get access to custom attributes.

using namespace System;

public ref class ExampleAttribute : Attribute
{
private:
    String^ stringVal;

public:
    ExampleAttribute()
    {
        stringVal = "This is the default string.";
    }


    property String^ StringValue
    {
        String^ get() { return stringVal; }
        void set(String^ value) { stringVal = value; }
    }
};

[Example(StringValue="This is a string.")]
public ref class Class1
{
public:
    static void Main()
    {
        System::Reflection::MemberInfo^ info = Type::GetType("Class1");
        for each (Object^ attrib in info->GetCustomAttributes(true))
        {
            Console::WriteLine(attrib);
        }
    }
};

int main()
{
    Class1::Main();
}
using System;

public class ExampleAttribute : Attribute
{
    private string stringVal;

    public ExampleAttribute()
    {
        stringVal = "This is the default string.";
    }

    public string StringValue
    {
        get { return stringVal; }
        set { stringVal = value; }
    }
}

[Example(StringValue="This is a string.")]
class Class1
{
    public static void Main()
    {
        System.Reflection.MemberInfo info = typeof(Class1);
        foreach (object attrib in info.GetCustomAttributes(true))
        {
            Console.WriteLine(attrib);
        }
    }
}
Public Class ExampleAttribute
    Inherits Attribute

    Private stringVal As String

    Public Sub New()
        stringVal = "This is the default string."
    End Sub

    Public Property StringValue() As String
        Get
            Return stringVal
        End Get
        Set(Value As String)
            stringVal = Value
        End Set
    End Property
End Class

<Example(StringValue:="This is a string.")> _
Class Class1
    Public Shared Sub Main()
        Dim info As System.Reflection.MemberInfo = GetType(Class1)
        For Each attrib As Object In info.GetCustomAttributes(true)
            Console.WriteLine(attrib)
        Next attrib
    End Sub
End Class

関連項目See also