Ö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:
Aynı kapsama uygulanan bir özniteliğin birden çok örneğini alma
Farklı kapsamlara uygulanan bir özniteliğin birden çok örneğini alma
Ö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ış true
AttributeUsageAttribute ö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 GetCustomAttributes
GetCustomAttribute
tek 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 , Level
ve 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.