Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
När attribut har associerats med programelement kan reflektion användas för att fråga efter deras existens och värden. .NET tillhandahåller MetadataLoadContext, som du kan använda för att granska kod som inte kan läsas in för körning.
MetadataLoadContext
Det går inte att köra kod som läses in i kontexten MetadataLoadContext . Det innebär att instanser av anpassade attribut inte kan skapas, eftersom det skulle kräva att deras konstruktorer körs. Om du vill läsa in och undersöka anpassade attribut i kontexten MetadataLoadContext använder du CustomAttributeData klassen . Du kan hämta instanser av den här klassen med hjälp av lämplig överlagring av den statiska CustomAttributeData.GetCustomAttributes metoden. Mer information finns i Så här inspekterar du sammansättningsinnehåll med metadataLoadContext.
Körningskontexten
De huvudsakliga reflektionsmetoderna för att hämta attribut i körningskontexten är MemberInfo.GetCustomAttributes och Attribute.GetCustomAttributes.
Tillgängligheten för ett anpassat attribut kontrolleras med avseende på sammansättningen där det är kopplat. Detta motsvarar att kontrollera om en metod för en typ i sammansättningen där det anpassade attributet är kopplat kan anropa konstruktorn för det anpassade attributet.
Metoder såsom Assembly.GetCustomAttributes(Boolean) kontrollerar synligheten och tillgängligheten för typargumentet. Endast kod i sammansättningen som innehåller den användardefinierade typen kan hämta ett anpassat attribut av den typen med hjälp av GetCustomAttributes.
Följande C#-exempel är ett typiskt designmönster för anpassade attribut. Den illustrerar den anpassade attributreflektionsmodellen för körningsmiljön.
System.DLL
public class DescriptionAttribute : Attribute
{
}
System.Web.DLL
internal class MyDescriptionAttribute : DescriptionAttribute
{
}
public class LocalizationExtenderProvider
{
[MyDescriptionAttribute(...)]
public CultureInfo GetLanguage(...)
{
}
}
Om körningstiden försöker hämta de anpassade attributen för den offentliga anpassade attributtypen DescriptionAttribute som är kopplad till metoden GetLanguage, utför den följande åtgärder:
- Programkörningen kontrollerar att typargumentet
DescriptionAttributetillType.GetCustomAttributes(Type type)är allmänt tillgängligt och därför är synligt och tillgängligt. - Körningen kontrollerar att den användardefinierade typen
MyDescriptionAttributesom härleds frånDescriptionAttributeär synlig och tillgänglig i den System.Web.dll sammansättningen, där den är kopplad till metodenGetLanguage(). - Körningen kontrollerar att konstruktorn av
MyDescriptionAttributeär synlig och tillgänglig i System.Web.dll-assemblyn. - Körningen anropar konstruktorn för
MyDescriptionAttributemed de anpassade attributparametrarna, och returnerar det nya objektet till anroparen.
Den anpassade attributreflektionsmodellen kan läcka instanser av användardefinierade typer utanför sammansättningen där typen definieras. Detta skiljer sig inte från medlemmarna i runtime-systembiblioteket som returnerar instanser av användardefinierade typer, till exempel Type.GetMethods att returnera en matris med RuntimeMethodInfo objekt. Om du vill förhindra att en klient identifierar information om en användardefinierad anpassad attributtyp definierar du typens medlemmar som icke-offentliga.
I följande exempel visas det grundläggande sättet att använda reflektion för att få åtkomst till anpassade attribut.
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