Delen via


Aangepaste kenmerken openen

Nadat kenmerken zijn gekoppeld aan programma-elementen, kan reflectie worden gebruikt om hun bestaan en waarden op te vragen. .NET biedt de MetadataLoadContext, die u kunt gebruiken om code te onderzoeken die niet kan worden geladen voor uitvoering.

MetadataLoadContext

Code die in de MetadataLoadContext context is geladen, kan niet worden uitgevoerd. Dit betekent dat exemplaren van aangepaste kenmerken niet kunnen worden gemaakt, omdat hiervoor de constructors moeten worden uitgevoerd. Als u aangepaste kenmerken in de MetadataLoadContext context wilt laden en onderzoeken, gebruikt u de CustomAttributeData klasse. U kunt exemplaren van deze klasse verkrijgen met behulp van de juiste overbelasting van de statische CustomAttributeData.GetCustomAttributes methode. Zie voor meer informatie: Assembly-inhoud inspecteren met MetadataLoadContext.

De uitvoeringscontext

De belangrijkste reflectiemethoden voor het opvragen van kenmerken in de uitvoeringscontext zijn MemberInfo.GetCustomAttributes en Attribute.GetCustomAttributes.

De toegankelijkheid van een aangepast kenmerk wordt gecontroleerd met betrekking tot de assembly waarin het is gekoppeld. Dit komt overeen met het controleren of een methode voor een type in de assembly waarin het aangepaste kenmerk is gekoppeld, de constructor van het aangepaste kenmerk kan aanroepen.

Methoden zoals Assembly.GetCustomAttributes(Boolean) de zichtbaarheid en toegankelijkheid van het typeargument controleren. Alleen code in de assembly die het door de gebruiker gedefinieerde type bevat, kan een aangepast kenmerk van dat type ophalen met behulp van GetCustomAttributes.

Het volgende C#-voorbeeld is een typisch aangepast kenmerkontwerppatroon. Het illustreert het weerspiegelingsmodel voor aangepaste runtimekenmerken.

System.DLL
public class DescriptionAttribute : Attribute
{
}

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

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

Als de runtime probeert de aangepaste kenmerken op te halen voor het openbare aangepaste kenmerktype DescriptionAttribute dat is gekoppeld aan de GetLanguage methode, worden de volgende acties uitgevoerd:

  1. De runtime controleert of het typeargument DescriptionAttributeType.GetCustomAttributes(Type type) openbaar is en daarom zichtbaar en toegankelijk is.
  2. De runtime controleert of het door de gebruiker gedefinieerde type MyDescriptionAttribute dat is afgeleid DescriptionAttribute van zichtbaar en toegankelijk is binnen de System.Web.dll assembly, waar het is gekoppeld aan de methode GetLanguage().
  3. De runtime controleert of de constructor MyDescriptionAttribute zichtbaar en toegankelijk is binnen de System.Web.dll assembly.
  4. De runtime roept de constructor van MyDescriptionAttribute aan met de parameters van het aangepaste kenmerk en geeft het nieuwe object terug aan de oproeper.

Het aangepaste attributenreflectiemodel kan exemplaren van door gebruikers gedefinieerde typen blootstellen buiten de assembly waarin het type is gedefinieerd. Dit verschilt niet van de leden in de runtimesysteembibliotheek die exemplaren van door de gebruiker gedefinieerde typen retourneren, zoals Type.GetMethods dat een array van RuntimeMethodInfo objecten retourneert. Als u wilt voorkomen dat een client informatie over een door de gebruiker gedefinieerd aangepast kenmerktype ontdekt, definieert u de leden van het type die niet openbaar zijn.

In het volgende voorbeeld ziet u de basiswijze voor het gebruik van weerspiegeling om toegang te krijgen tot aangepaste kenmerken.

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

Zie ook