Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Po skojarzeniu atrybutów z elementami programu refleksja może służyć do wykonywania zapytań dotyczących ich istnienia i wartości. Platforma .NET udostępnia element MetadataLoadContext, którego można użyć do zbadania kodu, którego nie można załadować do wykonania.
MetadataLoadContext
Nie można wykonać kodu załadowanego do MetadataLoadContext kontekstu. Oznacza to, że nie można utworzyć wystąpień atrybutów niestandardowych, gdyż to wymagałoby uruchomienia ich konstruktorów. Aby załadować i zbadać atrybuty niestandardowe w MetadataLoadContext kontekście, skorzystaj z klasy CustomAttributeData. Wystąpienia tej klasy można uzyskać przy użyciu odpowiedniego przeciążenia metody statycznej CustomAttributeData.GetCustomAttributes . Aby uzyskać więcej informacji, zobacz How to: Inspect assembly contents using MetadataLoadContext (Instrukcje: sprawdzanie zawartości zestawu przy użyciu elementu MetadataLoadContext).
Kontekst wykonywania
Główne metody odbicia atrybutów zapytania w kontekście wykonywania to MemberInfo.GetCustomAttributes i Attribute.GetCustomAttributes.
Dostępność atrybutu niestandardowego jest sprawdzana w odniesieniu do zestawu, w którym jest dołączony. Jest to równoważne sprawdzaniu, czy metoda w typie w zestawie, do którego jest dołączony atrybut niestandardowy, może wywołać konstruktor tego atrybutu.
Metody, takie jak Assembly.GetCustomAttributes(Boolean), sprawdzają widoczność i dostępność argumentu typu. Tylko kod w zestawie zawierający typ zdefiniowany przez użytkownika może pobrać atrybut niestandardowy tego typu przy użyciu polecenia GetCustomAttributes.
Poniższy przykład w języku C# jest typowym wzorcem projektowania atrybutów niestandardowych. Ilustruje model refleksji atrybutu niestandardowego środowiska uruchomieniowego.
System.DLL
public class DescriptionAttribute : Attribute
{
}
System.Web.DLL
internal class MyDescriptionAttribute : DescriptionAttribute
{
}
public class LocalizationExtenderProvider
{
[MyDescriptionAttribute(...)]
public CultureInfo GetLanguage(...)
{
}
}
Jeśli środowisko uruchomieniowe próbuje pobrać atrybuty niestandardowe typu publicznego DescriptionAttribute dołączone do metody GetLanguage, wykonuje następujące czynności:
- Środowisko uruchomieniowe sprawdza, czy argument typu
DescriptionAttributedoType.GetCustomAttributes(Type type)jest publiczny, a zatem jest widoczny i dostępny. - Środowisko uruchomieniowe sprawdza, czy typ
MyDescriptionAttributezdefiniowany przez użytkownika, z którego pochodziDescriptionAttribute, jest widoczny i dostępny w zestawie System.Web.dll, gdzie jest dołączony do metodyGetLanguage(). - Środowisko uruchomieniowe sprawdza, czy konstruktor obiektu
MyDescriptionAttributejest widoczny i dostępny w zestawie System.Web.dll. - Środowisko uruchomieniowe wywołuje konstruktor
MyDescriptionAttributez parametrami atrybutu niestandardowego i zwraca nowy obiekt do obiektu wywołującego.
Model odbicia atrybutu niestandardowego może powodować wyciek wystąpień typów zdefiniowanych przez użytkownika poza zestaw, w którym typ jest zdefiniowany. Nie różni się to od elementów w bibliotece systemu środowiska uruchomieniowego, które zwracają instancje typów zdefiniowanych przez użytkownika, takich jak Type.GetMethods, zwracający tablicę obiektów RuntimeMethodInfo. Aby uniemożliwić klientowi odnajdywanie informacji o typie atrybutu niestandardowego zdefiniowanego przez użytkownika, zdefiniuj elementy członkowskie typu jako niepubliczne.
W poniższym przykładzie przedstawiono podstawowy sposób używania odbicia w celu uzyskania dostępu do atrybutów niestandardowych.
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
Zobacz także
- MemberInfo.GetCustomAttributes
- Attribute.GetCustomAttributes
- informacje o typie widoku