CustomReflectionContext Klasa

Definicja

Reprezentuje dostosowywalny kontekst odbicia.

public ref class CustomReflectionContext abstract : System::Reflection::ReflectionContext
public abstract class CustomReflectionContext : System.Reflection.ReflectionContext
type CustomReflectionContext = class
    inherit ReflectionContext
Public MustInherit Class CustomReflectionContext
Inherits ReflectionContext
Dziedziczenie
CustomReflectionContext
Pochodne

Uwagi

CustomReflectionContext zapewnia możliwość dodawania lub usuwania atrybutów niestandardowych z obiektów odbicia lub dodawania fikcyjnych właściwości do tych obiektów bez ponownego implementowania kompletnego modelu odbicia. Domyślne CustomReflectionContext po prostu zawija obiekty odbicia bez wprowadzania żadnych zmian, ale poprzez utworzenie podklasy i zastąpienie odpowiednich metod, można dodawać, usuwać lub zmieniać atrybuty dotyczące dowolnego odbitego parametru lub elementu członkowskiego, lub dodać nowe właściwości do odbitego typu.

Załóżmy na przykład, że kod jest zgodny z konwencją stosowania określonego atrybutu do metod fabrycznych, ale teraz musisz pracować z kodem innej firmy, który nie ma atrybutów. Możesz użyć CustomReflectionContext aby określić regułę identyfikowania obiektów, które powinny mieć atrybuty, oraz nadawania tym obiektom tych atrybutów podczas ich wyświetlania w kodzie.

Aby efektywnie używać CustomReflectionContext, kod używający odzwierciedlonych obiektów musi obsługiwać pojęcie określania kontekstu refleksji, zamiast zakładać, że wszystkie odzwierciedlone obiekty są skojarzone z kontekstem refleksji środowiska uruchomieniowego. Wiele metod odbicia w .NET udostępnia ReflectionContext parametr w tym celu.

Aby zmodyfikować atrybuty stosowane do odzwierciedlonego parametru lub elementu członkowskiego, przesłoń metodę GetCustomAttributes(ParameterInfo, IEnumerable<Object>) lub GetCustomAttributes(MemberInfo, IEnumerable<Object>) . Metody te przyjmują obiekt podlegający odbiciu i listę atrybutów w jego bieżącym kontekście odbicia i zwracają listę atrybutów, które powinny znajdować się zgodnie z niestandardowym kontekstem odbicia.

Warning

CustomReflectionContext przesłonięcia nie powinny wykonywać zapytań względem atrybutów podanych MemberInfo lub ParameterInfo przez wywołanie metody GetCustomAttributes; zamiast tego użyj declaredAttributes sekwencji przekazanej GetCustomAttributes do przeciążeń.

Aby dodać właściwości do typu odzwierciedlonego, zastąpij metodę AddProperties . Metoda akceptuje parametr określający odzwierciedlonego typu i zwraca listę dodatkowych właściwości. Należy użyć metody CreateProperty, aby utworzyć obiekty właściwości do zwrócenia. Delegatów można określić podczas tworzenia właściwości, która służy jako metoda dostępu do właściwości, i można pominąć jeden z metod dostępu, aby utworzyć właściwość tylko do odczytu lub tylko do zapisu. Należy pamiętać, że takie fikcyjne właściwości nie mają żadnych metadanych ani wsparcia w postaci wspólnego języka pośredniego (CIL, Common Intermediate Language).

Warning

  • Należy zachować ostrożność co do równości między odzwierciedlonymi obiektami podczas pracy z kontekstami odbicia, ponieważ obiekty mogą reprezentować ten sam odzwierciedlony obiekt w wielu kontekstach. Można użyć MapType metody , aby uzyskać wersję określonego kontekstu odbicia obiektu odzwierciedlonego.
  • Obiekt CustomReflectionContext zmienia atrybuty zwracane przez określony obiekt odbicia, na przykład te uzyskane przez metodę GetCustomAttributes . Nie zmienia ona danych atrybutów niestandardowych zwracanych przez GetCustomAttributesData metodę, a te dwie listy nie będą zgodne w przypadku użycia niestandardowego kontekstu odbicia.

W poniższym przykładzie pokazano, jak podklasy CustomReflectionContext dodać atrybut niestandardowy do wszystkich elementów członkowskich danego typu, których nazwy zaczynają się od "Do".

// A blank example attribute.
class MyAttribute : Attribute
{
}

// Reflection context with custom rules.
class MyCustomReflectionContext : CustomReflectionContext
{
    // Called whenever the reflection context checks for custom attributes.
    protected override IEnumerable<object> GetCustomAttributes(MemberInfo member, IEnumerable<object> declaredAttributes)
    {
        // Add example attribute to "To*" members.
        if (member.Name.StartsWith("To", StringComparison.Ordinal))
        {
            yield return new MyAttribute();
        }
        // Keep existing attributes as well.
        foreach (object attr in declaredAttributes)
        {
            yield return attr;
        }
    }
}
MyCustomReflectionContext mc = new();
Type t = typeof(string);

// A representation of the type in the default reflection context.
TypeInfo ti = t.GetTypeInfo();

// A representation of the type in the customized reflection context.
TypeInfo myTI = mc.MapType(ti);

// Display affected members of the type ("To*") and their attributes.
foreach (MemberInfo m in myTI.DeclaredMembers.Where(static m => m.Name.StartsWith("To", StringComparison.Ordinal)))
{
    Console.WriteLine($"{m.Name}:");
    foreach (Attribute cd in m.GetCustomAttributes())
    {
        Console.WriteLine(cd.GetType());
    }
}

Console.WriteLine();

// The "ToString" member as represented in the default reflection context.
MemberInfo mi1 = ti.GetDeclaredMethods("ToString").FirstOrDefault();

Attribute[] defaultAttributes = mi1.GetCustomAttributes().ToArray();

// All the attributes of "ToString" in the default reflection context.
Console.WriteLine("'ToString' Attributes in Default Reflection Context:");
foreach (Attribute cd in defaultAttributes)
{
    Console.WriteLine(cd.GetType());
}

Console.WriteLine();

// The same member in the custom reflection context.
mi1 = myTI.GetDeclaredMethods("ToString").FirstOrDefault();

Attribute[] customAttributes = mi1.GetCustomAttributes().ToArray();

// All its attributes, for comparison. MyAttribute is now included.
Console.WriteLine("'ToString' Attributes in Custom Reflection Context:");
foreach (Attribute cd in customAttributes)
{
    Console.WriteLine(cd.GetType());
}

Konstruktory

Nazwa Opis
CustomReflectionContext()

Inicjuje nowe wystąpienie klasy CustomReflectionContext.

CustomReflectionContext(ReflectionContext)

Inicjuje nowe wystąpienie CustomReflectionContext klasy z określonym kontekstem odbicia jako bazą.

Metody

Nazwa Opis
AddProperties(Type)

Po zastąpieniu w klasie pochodnej udostępnia kolekcję dodatkowych właściwości dla określonego typu, jak pokazano w tym kontekście odbicia.

CreateProperty(Type, String, Func<Object,Object>, Action<Object,Object>, IEnumerable<Attribute>, IEnumerable<Attribute>, IEnumerable<Attribute>)

Tworzy obiekt reprezentujący właściwość do dodania do typu, który ma być używany z AddProperties(Type) metodą i przy użyciu określonych atrybutów niestandardowych.

CreateProperty(Type, String, Func<Object,Object>, Action<Object,Object>)

Tworzy obiekt reprezentujący właściwość, która ma zostać dodana do typu, który ma być używany z AddProperties(Type) metodą .

Equals(Object)

Określa, czy określony obiekt jest równy bieżącemu obiektowi.

(Odziedziczone po Object)
GetCustomAttributes(MemberInfo, IEnumerable<Object>)

Po zastąpieniu w klasie pochodnej udostępnia listę atrybutów niestandardowych dla określonego elementu członkowskiego, jak pokazano w tym kontekście odbicia.

GetCustomAttributes(ParameterInfo, IEnumerable<Object>)

Po zastąpieniu w klasie pochodnej udostępnia listę atrybutów niestandardowych dla określonego parametru, jak pokazano w tym kontekście odbicia.

GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetType()

Pobiera Type bieżącego wystąpienia.

(Odziedziczone po Object)
GetTypeForObject(Object)

Pobiera reprezentację typu określonego obiektu w tym kontekście odbicia.

(Odziedziczone po ReflectionContext)
MapAssembly(Assembly)

Pobiera reprezentację w tym kontekście odbicia zestawu reprezentowanego przez obiekt z innego kontekstu odbicia.

MapType(TypeInfo)

Pobiera reprezentację w tym kontekście odbicia typu reprezentowanego przez obiekt z innego kontekstu odbicia.

MemberwiseClone()

Tworzy płytkią kopię bieżącego Object.

(Odziedziczone po Object)
ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Dotyczy