Özniteliklerde Depolanan Bilgileri Alma

Özel öznitelik almak basit bir işlemdir. İlk olarak, almak istediğiniz özniteliğin bir örneğini bildirin. Ardından, almak istediğiniz özniteliğin değerinin yeni özniteliğini başlatmak için yöntemini kullanın Attribute.GetCustomAttribute . Yeni öznitelik başlatıldıktan sonra, değerleri almak için özelliklerini kullanabilirsiniz.

Önemli

Bu makalede, yürütme bağlamı içine yüklenen kod için özniteliklerin nasıl alındığı açıklanmaktadır. Yalnızca yansıma bağlamı içine yüklenen kodun özniteliklerini almak için, Nasıl yapılır: Derlemeleri Yalnızca Düşünceler Bağlama Yükleme bölümünde gösterildiği gibi sınıfını kullanmanız CustomAttributeData gerekir.

Bu bölümde, öznitelikleri almanın aşağıdaki yolları açıklanmaktadır:

Özniteliğin Tek Bir Örneğini Alma

Aşağıdaki örnekte, DeveloperAttribute (önceki bölümde açıklanan) sınıfına MainApp sınıf düzeyinde uygulanır. yöntemi, GetAttribute içinde depolanan değerleri konsolda DeveloperAttribute görüntülemeden önce sınıf düzeyinde almak için kullanırGetCustomAttribute.

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.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

Önceki programın yürütülmesinde aşağıdaki metin görüntülenir:

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

Öznitelik bulunamazsa, GetCustomAttribute yöntemi null değere başlatılır MyAttribute . Bu örnek, böyle bir örneği denetler MyAttribute ve özniteliğin bulunup bulunmadığını kullanıcıya bildirir. Sınıf kapsamında bulunamazsa DeveloperAttribute konsol aşağıdaki iletiyi görüntüler:

The attribute was not found.

Yukarıdaki örnekte öznitelik tanımının geçerli ad alanında olduğu varsayılır. Geçerli ad alanında değilse öznitelik tanımının bulunduğu ad alanını içeri aktarmayı unutmayın.

Aynı Kapsama Uygulanan Özniteliğin Birden Çok Örneğini Alma

Yukarıdaki örnekte, denetlenecek sınıf ve bulunacak belirli öznitelik yöntemine GetCustomAttribute geçirilir. Sınıf düzeyinde bir özniteliğin yalnızca bir örneği uygulandığında bu kod düzgün çalışır. Ancak, bir özniteliğin birden çok örneği aynı sınıf düzeyinde uygulanırsa, GetCustomAttribute yöntem tüm bilgileri almaz. Aynı özniteliğin birden çok örneğinin aynı kapsama uygulandığı durumlarda, bir özniteliğin tüm örneklerini bir diziye yerleştirmek için yöntemini kullanabilirsiniz Attribute.GetCustomAttributes . Örneğin, iki örneği DeveloperAttribute aynı sınıfın sınıf düzeyinde uygulanırsa, GetAttribute yöntemi her iki öznitelikte bulunan bilgileri görüntülemek için değiştirilebilir. Aynı düzeyde birden çok öznitelik uygulamak için unutmayın. özniteliği, sınıfında olarak ayarlanmış trueAttributeUsageAttribute özelliğiyle AllowMultiple tanımlanmalıdır.

Aşağıdaki kod örneği, belirli bir sınıftaki GetCustomAttributes tüm örneklerine DeveloperAttribute başvuran bir dizi oluşturmak için yönteminin nasıl kullanılacağını gösterir. Kod daha sonra konsola tüm özniteliklerin değerlerini verir.

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

Öznitelik bulunmazsa, bu kod kullanıcıyı uyarır. Aksi takdirde, her iki örneğinde DeveloperAttribute de yer alan bilgiler görüntülenir.

Farklı Kapsamlara Uygulanan Bir Özniteliğin Birden Çok Örneğini Alma

GetCustomAttributes ve GetCustomAttribute yöntemleri tüm sınıfı aramaz ve bir özniteliğin bu sınıftaki tüm örneklerini döndürmez. Bunun yerine, aynı anda yalnızca bir belirtilen yöntemi veya üyeyi arar. Her üyeye aynı özniteliğin uygulandığı bir sınıfınız varsa ve bu üyelere uygulanan tüm özniteliklerdeki değerleri almak istiyorsanız, ve için her yöntemi veya üyeyi GetCustomAttributesGetCustomAttributetek tek sağlamanız gerekir.

Aşağıdaki kod örneği bir sınıfı parametre olarak alır ve sınıf düzeyinde ve bu sınıfın DeveloperAttribute her bir yönteminde (daha önce tanımlanmıştır) öğesini arar:

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

Yöntem düzeyinde veya sınıf düzeyinde öğesinin DeveloperAttribute hiçbir örneği bulunmazsa, GetAttribute yöntem kullanıcıya öznitelik bulunamadığını bildirir ve özniteliği içermeyen yöntemin veya sınıfın adını görüntüler. Bir öznitelik bulunursa, konsolda , Levelve Reviewed alanları görüntülenirName.

Sınıfın üyelerini Type kullanarak tek tek yöntemleri ve geçirilen sınıftaki üyeleri alabilirsiniz. Bu örnek önce sınıf düzeyine ilişkin öznitelik bilgilerini almak için nesnesini sorgular Type . Ardından, yöntem düzeyi için öznitelik bilgilerini almak üzere tüm yöntemlerin System.Reflection.MemberInfo örneklerini bir nesne dizisine yerleştirmek için kullanırType.GetMethods. Özellik düzeyinde öznitelikleri denetlemek veya Type.GetConstructors oluşturucu düzeyinde öznitelikleri denetlemek için yöntemini de kullanabilirsinizType.GetProperties.

Ayrıca bkz.