Özel özniteliklere erişme
Öznitelikler program öğeleriyle ilişkilendirildikten sonra, bunların varlığını ve değerlerini sorgulamak için yansıma kullanılabilir. .NET, yürütme için yüklenebilen kodu incelemek için kullanabileceğiniz öğesini sağlar MetadataLoadContext.
MetadataLoadContext
Bağlama yüklenen MetadataLoadContext kod yürütülemez. Bu, oluşturucularının yürütülmesini gerektireceğinden özel öznitelik örneklerinin oluşturulamayacağı anlamına gelir. Bağlamdaki özel öznitelikleri MetadataLoadContext yüklemek ve incelemek için sınıfını CustomAttributeData kullanın. Statik CustomAttributeData.GetCustomAttributes yöntemin uygun aşırı yüklemesini kullanarak bu sınıfın örneklerini alabilirsiniz. Daha fazla bilgi için bkz . Nasıl yapılır: MetadataLoadContext kullanarak derleme içeriğini inceleme.
Yürütme bağlamı
Yürütme bağlamında öznitelikleri sorgulamak için ana yansıma yöntemleri ve Attribute.GetCustomAttributes'tirMemberInfo.GetCustomAttributes.
Özel özniteliğin erişilebilirliği, eklendiği derlemeye göre denetlendi. Bu, özel özniteliğin eklendiği derlemedeki bir türdeki yöntemin özel özniteliğin oluşturucusunu çağırıp çağıramayacağını denetlemeye eşdeğerdir.
Tür bağımsız değişkeninin görünürlüğünü ve erişilebilirliğini denetleme gibi Assembly.GetCustomAttributes(Boolean) yöntemler. Yalnızca kullanıcı tanımlı türü içeren derlemedeki kod kullanarak GetCustomAttributes
bu türün özel özniteliğini alabilir.
Aşağıdaki C# örneği tipik bir özel öznitelik tasarım desenidir. Çalışma zamanı özel öznitelik yansıma modelini gösterir.
System.DLL
public class DescriptionAttribute : Attribute
{
}
System.Web.DLL
internal class MyDescriptionAttribute : DescriptionAttribute
{
}
public class LocalizationExtenderProvider
{
[MyDescriptionAttribute(...)]
public CultureInfo GetLanguage(...)
{
}
}
Çalışma zamanı yöntemine eklenmiş GetLanguage
genel özel öznitelik türü DescriptionAttribute için özel öznitelikleri almaya çalışırsa, aşağıdaki eylemleri gerçekleştirir:
- Çalışma zamanı için tür bağımsız değişkeninin
DescriptionAttribute
Type.GetCustomAttributes(Type type)
genel olduğunu ve bu nedenle görünür ve erişilebilir olduğunu denetler. - Çalışma zamanı, 'den
DescriptionAttribute
türetilen kullanıcı tanımlı türünMyDescriptionAttribute
, yöntemineGetLanguage()
eklendiği System.Web.dll derlemesinde görünür ve erişilebilir olup olmadığını denetler. - Çalışma zamanı oluşturucusunun
MyDescriptionAttribute
System.Web.dll derlemesinde görünür ve erişilebilir olup olmadığını denetler. - Çalışma zamanı özel öznitelik parametreleriyle oluşturucusunu
MyDescriptionAttribute
çağırır ve yeni nesneyi çağırana döndürür.
Özel öznitelik yansıma modeli, kullanıcı tanımlı türlerin örneklerini türün tanımlandığı derlemenin dışına sızdırabilir. Bu, bir nesne dizisi döndürme gibi Type.GetMethods kullanıcı tanımlı türlerin örneklerini döndüren çalışma zamanı sistem kitaplığındaki üyelerden RuntimeMethodInfo
farklı değildir. İstemcinin kullanıcı tanımlı özel öznitelik türüyle ilgili bilgileri bulmasını önlemek için türün üyelerini abonelik dışı olacak şekilde tanımlayın.
Aşağıdaki örnekte, özel özniteliklere erişim elde etmek için yansıma kullanmanın temel yolu gösterilmektedir.
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