Aracılığıyla paylaş


Ö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üklenemeyen kodu incelemek amacıyla kullanabileceğiniz MetadataLoadContext sağlar.

MetadataLoadContext

MetadataLoadContext çerçevesine yüklenen kod çalıştırılamaz. Bu, oluşturucularının yürütülmesini gerektireceğinden özel öznitelik örneklerinin oluşturulamayacağı anlamına gelir. Özel öznitelikleri MetadataLoadContext bağlamında yüklemek ve incelemek için CustomAttributeData sınıfını 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 MemberInfo.GetCustomAttributes ve Attribute.GetCustomAttributes'tir.

Özel bir özniteliğin erişilebilirliği, eklendiği derleme bakımından kontrol edilir. 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.

Bunun gibi Assembly.GetCustomAttributes(Boolean) yöntemler, tür bağımsız değişkeninin görünürlüğünü ve erişilebilirliğini denetler. Kullanıcı tanımlı türü içeren derlemedeki kod yalnızca GetCustomAttributes kullanarak 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 nitelik yansıma modelini tasvir eder.

System.DLL
public class DescriptionAttribute : Attribute
{
}

System.Web.DLL
internal class MyDescriptionAttribute : DescriptionAttribute
{
}

public class LocalizationExtenderProvider
{
    [MyDescriptionAttribute(...)]
    public CultureInfo GetLanguage(...)
    {
    }
}

Çalışma zamanı, DescriptionAttribute yöntemine bağlı genel özel öznitelik türü GetLanguage için özel öznitelikleri almaya çalıştığında, aşağıdaki eylemleri gerçekleştirir:

  1. Çalışma zamanı, tür bağımsız değişkeni DescriptionAttributeType.GetCustomAttributes(Type type)'nin genel olduğunu, dolayısıyla görünür ve erişilebilir olduğunu denetler.
  2. Çalışma zamanı, MyDescriptionAttribute'den türetilmiş kullanıcı tanımlı tür DescriptionAttribute'in, GetLanguage() yöntemine eklendiğinde System.Web.dll derlemesi içinde görünür ve erişilebilir olup olmadığını denetler.
  3. Çalışma zamanı, MyDescriptionAttribute oluşturucusunun System.Web.dll derlemesi içinde görünür ve erişilebilir olduğunu kontrol eder.
  4. Çalışma zamanı, MyDescriptionAttribute oluşturucusunu özel öznitelik parametreleriyle ç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. Çalışma zamanı sistem kitaplığındaki, Type.GetMethods gibi kullanıcı tanımlı türlerin örneklerini döndüren ve RuntimeMethodInfo nesnelerinin bir dizisini döndüren üyelerden 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 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

Ayrıca bakınız