CustomReflectionContext Klasse

Definition

Stellt einen anpassbaren Spiegelungskontext dar.

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
Vererbung
CustomReflectionContext
Abgeleitet

Hinweise

CustomReflectionContext bietet eine Möglichkeit zum Hinzufügen oder Entfernen von benutzerdefinierten Attributen aus Spiegelungsobjekten oder zum Hinzufügen von Dummy-Eigenschaften zu diesen Objekten, ohne das vollständige Spiegelungsmodell erneut zu implementieren. Standardmäßig werden Reflexionsobjekte direkt umhüllt, ohne Änderungen vorzunehmen. Über die Bildung von Unterklassen und das Überschreiben der relevanten Methoden können Sie jedoch Attribute hinzufügen, entfernen oder ändern, die auf sämtliche reflektierten Parameter oder Mitglieder angewendet werden, oder neue Eigenschaften zu einem reflektierten Typ hinzufügen.

Angenommen, Ihr Code folgt der Konvention, ein bestimmtes Attribut auf Factorymethoden anzuwenden, aber Sie müssen jetzt mit Drittanbietercode arbeiten, der keine Attribute aufweist. Sie können CustomReflectionContext verwenden, um eine Regel zum Identifizieren der Objekte zu definieren, die Attribute aufweisen sollen, und um den Objekten diese Attribute zuzuweisen, wenn diese in Ihrem Code angezeigt werden.

Um effektiv zu verwenden CustomReflectionContext , muss der Code, der die reflektierten Objekte verwendet, das Konzept der Angabe eines Spiegelungskontexts unterstützen, anstatt davon auszugehen, dass alle reflektierten Objekte dem Laufzeitreflektionskontext zugeordnet sind. Viele Spiegelungsmethoden in .NET stellen zu diesem Zweck einen ReflectionContext Parameter bereit.

Um die Attribute zu ändern, die auf einen reflektierten Parameter oder ein Mitglied angewendet werden, überschreiben Sie die Methode GetCustomAttributes(ParameterInfo, IEnumerable<Object>) oder GetCustomAttributes(MemberInfo, IEnumerable<Object>). Diese Methoden übernehmen das reflektierte Objekt und die Liste der Attribute unter dem aktuellen Spiegelungskontext und geben die Liste der Attribute zurück, die sie im benutzerdefinierten Spiegelungskontext aufweisen sollen.

Warning

CustomReflectionContextAußerkraftsetzungen sollten keine Attribute für die bereitgestellte oder MemberInfo durch Aufrufen ParameterInfoabfragenGetCustomAttributes. Verwenden Sie stattdessen die declaredAttributes an die GetCustomAttributes Überladungen übergebene Sequenz.

Wenn Sie einem reflektierten Typ Eigenschaften hinzufügen möchten, setzen Sie die AddProperties Methode außer Kraft. Die Methode akzeptiert einen Parameter, der den reflektierten Typ angibt, und gibt eine Liste mit zusätzlichen Eigenschaften zurück. Verwenden Sie die CreateProperty-Methode, um Eigenschaftsobjekte zu erstellen und zurückzugeben. Sie können Stellvertretungen angeben, wenn Sie die Eigenschaft erstellen, die als Eigenschaftsaccessor dient, und Sie können einen der Accessoren weglassen, um eine schreibgeschützte oder schreibgeschützte Eigenschaft zu erstellen. Beachten Sie, dass solche Dummy-Eigenschaften keine Metadaten oder CIL -Unterstützung (Common Intermediate Language) aufweisen.

Warning

  • Seien Sie vorsichtig bei der Gleichheit zwischen reflektierten Objekten, wenn Sie mit Spiegelungskontexten arbeiten, da Objekte dasselbe reflektierte Objekt in mehreren Kontexten darstellen können. Mit der MapType Methode können Sie die Version eines bestimmten Spiegelungskontexts eines reflektierten Objekts abrufen.
  • Ein CustomReflectionContext Objekt ändert die attribute, die von einem bestimmten Spiegelungsobjekt zurückgegeben werden, z. B. die von der GetCustomAttributes Methode abgerufenen. Die von der GetCustomAttributesData Methode zurückgegebenen benutzerdefinierten Attributdaten werden nicht geändert, und diese beiden Listen stimmen nicht überein, wenn Sie einen benutzerdefinierten Spiegelungskontext verwenden.

Das folgende Beispiel demonstriert, wie man CustomReflectionContext unterklassen kann, um allen Mitgliedern eines bestimmten Typs, deren Namen mit "To" beginnen, ein benutzerdefiniertes Attribut hinzuzufügen.

// 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());
}

Konstruktoren

Name Beschreibung
CustomReflectionContext()

Initialisiert eine neue Instanz der CustomReflectionContext-Klasse.

CustomReflectionContext(ReflectionContext)

Initialisiert eine neue Instanz der CustomReflectionContext Klasse mit dem angegebenen Spiegelungskontext als Basis.

Methoden

Name Beschreibung
AddProperties(Type)

Wenn eine abgeleitete Klasse überschrieben wird, wird eine Auflistung zusätzlicher Eigenschaften für den angegebenen Typ bereitgestellt, wie in diesem Spiegelungskontext dargestellt.

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

Erstellt ein Objekt, das eine Eigenschaft darstellt, die einem Typ hinzugefügt werden soll, um mit der AddProperties(Type) Methode verwendet und die angegebenen benutzerdefinierten Attribute zu verwenden.

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

Erstellt ein Objekt, das eine Eigenschaft darstellt, die einem Typ hinzugefügt werden soll, der mit der AddProperties(Type) Methode verwendet werden soll.

Equals(Object)

Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht.

(Geerbt von Object)
GetCustomAttributes(MemberInfo, IEnumerable<Object>)

Wenn eine abgeleitete Klasse überschrieben wird, wird eine Liste von benutzerdefinierten Attributen für das angegebene Element bereitgestellt, wie in diesem Spiegelungskontext dargestellt.

GetCustomAttributes(ParameterInfo, IEnumerable<Object>)

Wenn eine abgeleitete Klasse überschrieben wird, wird eine Liste von benutzerdefinierten Attributen für den angegebenen Parameter bereitgestellt, wie in diesem Spiegelungskontext dargestellt.

GetHashCode()

Dient als Standardhashfunktion.

(Geerbt von Object)
GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
GetTypeForObject(Object)

Ruft die Darstellung des Typs des angegebenen Objekts in diesem Spiegelungskontext ab.

(Geerbt von ReflectionContext)
MapAssembly(Assembly)

Ruft die Darstellung in diesem Spiegelungskontext einer Assembly ab, die durch ein Objekt aus einem anderen Spiegelungskontext dargestellt wird.

MapType(TypeInfo)

Ruft die Darstellung in diesem Spiegelungskontext eines Typs ab, der durch ein Objekt aus einem anderen Spiegelungskontext dargestellt wird.

MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Gilt für: