Přístup k vlastním atributům

Po přidružení atributů k prvkům programu lze reflexi použít k dotazování jejich existence a hodnot. .NET poskytuje MetadataLoadContext, který můžete použít k prozkoumání kódu, který nelze načíst pro spuštění.

MetadataLoadContext

Kód načtený MetadataLoadContext do kontextu nelze spustit. To znamená, že instance vlastních atributů nelze vytvořit, protože by to vyžadovalo spuštění jejich konstruktorů. Pokud chcete načíst a prozkoumat vlastní atributy v MetadataLoadContext kontextu, použijte CustomAttributeData třídu. Instance této třídy můžete získat pomocí příslušné přetížení statické CustomAttributeData.GetCustomAttributes metody. Další informace naleznete v tématu Postupy: Kontrola obsahu sestavení pomocí MetadataLoadContext.

Kontext spuštění

Hlavní metody reflexe dotazování atributů v kontextu provádění jsou MemberInfo.GetCustomAttributes a Attribute.GetCustomAttributes.

Přístupnost vlastního atributu je kontrolována s ohledem na sestavení, ve kterém je připojeno. To je ekvivalentem kontroly, zda metoda typu v sestavení, ve kterém je vlastní atribut připojen, může volat konstruktor vlastního atributu.

Metody, jako Assembly.GetCustomAttributes(Boolean) je kontrola viditelnosti a přístupnosti argumentu typu. Pouze kód v sestavení, který obsahuje uživatelem definovaný typ může načíst vlastní atribut tohoto typu pomocí GetCustomAttributes.

Následující příklad jazyka C# je typický vzor návrhu vlastních atributů. Znázorňuje model reflexe vlastního atributu modulu runtime.

System.DLL
public class DescriptionAttribute : Attribute
{
}

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

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

Pokud se modul runtime pokouší načíst vlastní atributy pro typ veřejného vlastního atributu DescriptionAttribute připojeného GetLanguage k metodě, provede následující akce:

  1. Modul runtime zkontroluje, zda je argument DescriptionAttributeType.GetCustomAttributes(Type type) typu veřejný, a proto je viditelný a přístupný.
  2. Modul runtime zkontroluje, zda je uživatelem definovaný typ MyDescriptionAttribute odvozený z DescriptionAttribute viditelného a přístupného v rámci sestavení System.Web.dll, kde je připojen k metodě GetLanguage().
  3. Modul runtime zkontroluje, že konstruktor MyDescriptionAttribute je viditelný a přístupný v rámci System.Web.dll sestavení.
  4. Modul runtime volá konstruktor s parametry vlastního MyDescriptionAttribute atributu a vrátí nový objekt volajícímu.

Model reflexe vlastního atributu může uniknout instancím uživatelem definovaných typů mimo sestavení, ve kterém je typ definován. To se neliší od členů v systémové knihovně modulu runtime, která vrací instance uživatelem definovaných typů, například Type.GetMethods vrácení pole RuntimeMethodInfo objektů. Chcete-li klientovi zabránit ve zjišťování informací o uživatelem definovaném vlastním typu atributu, definujte členy typu, které mají být nepublikované.

Následující příklad ukazuje základní způsob použití reflexe k získání přístupu k vlastním atributům.

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

Viz také