Ö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 GetCustomAttributesbu 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:

  1. Çalışma zamanı için tür bağımsız değişkeninin DescriptionAttributeType.GetCustomAttributes(Type type) genel olduğunu ve bu nedenle görünür ve erişilebilir olduğunu denetler.
  2. Çalışma zamanı, 'den DescriptionAttribute türetilen kullanıcı tanımlı türünMyDescriptionAttribute, yöntemine GetLanguage()eklendiği System.Web.dll derlemesinde görünür ve erişilebilir olup olmadığını denetler.
  3. Çalışma zamanı oluşturucusunun MyDescriptionAttribute System.Web.dll derlemesinde görünür ve erişilebilir olup olmadığını denetler.
  4. Ç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

Ayrıca bkz.