Freigeben über


CustomReflectionContext Klasse

Definition

Stellt einen benutzerdefinierten Reflektionskontext 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

Beispiele

Im folgenden Beispiel wird veranschaulicht, wie Eine Unterklasse CustomReflectionContext zum Hinzufügen eines benutzerdefinierten Attributs zu allen Membern eines bestimmten Typs ausgeführt wird, dessen Namen mit "To" beginnen. Fügen Sie ihn zum Ausführen dieses Codes in ein leeres Konsolenprojekt ein, und fügen Sie einen Verweis auf System.Reflection.Context.dll hinzu.

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

//Reflection context with custom rules.
class myCRC : 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")) {
                   yield return new myAttribute();
               }
               //Keep existing attributes as well.
               foreach (var attr in declaredAttributes) yield return attr;
         }
}

class Program
{
    static void Main(string[] args)
    {
        myCRC mc = new myCRC();
        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 all the members of the type and their attributes.
        foreach (MemberInfo m in myTI.DeclaredMembers)
        {
           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();

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

        Console.WriteLine();

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

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

        Console.ReadLine();
    }
}

Hinweise

CustomReflectionContext bietet eine Möglichkeit zum Hinzufügen oder Entfernen benutzerdefinierter Attribute aus Reflektionsobjekten oder zum Hinzufügen von Dummyeigenschaften zu diesen Objekten, ohne das vollständige Spiegelungsmodell erneut zu implementieren. Der Standard CustomReflectionContext umschließt einfach Reflektionsobjekte, ohne Änderungen vorzunehmen. Durch Unterklassen und Überschreiben der relevanten Methoden können Sie jedoch die Attribute hinzufügen, entfernen oder ändern, die für alle reflektierten Parameter oder Member gelten, oder einem reflektierten Typ neue Eigenschaften hinzufügen.

Angenommen, Ihr Code folgt der Konvention, ein bestimmtes Attribut auf Factorymethoden anzuwenden. Sie müssen jetzt jedoch mit Code von Drittanbietern arbeiten, der keine Attribute aufweist. Sie können verwenden CustomReflectionContext , um eine Regel zum Identifizieren der Objekte anzugeben, die Attribute aufweisen sollen, und um die Objekte mit diesen Attributen zu versorgen, wenn sie aus Ihrem Code angezeigt werden.

Um effektiv zu verwenden CustomReflectionContext , muss der Code, der die reflektierten Objekte verwendet, die Vorstellung unterstützen, einen Reflexionskontext anzugeben, anstatt davon auszugehen, dass alle reflektierten Objekte dem Laufzeitreflektionskontext zugeordnet sind. Viele Reflexionsmethoden in der .NET Framework einen Parameter für diesen Zweck bereitstellenReflectionContext.

Um die Attribute zu ändern, die auf einen reflektierten Parameter oder Member angewendet werden, überschreiben Sie die GetCustomAttributes(ParameterInfo, IEnumerable<Object>) -Methode 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 unter dem benutzerdefinierten Reflexionskontext enthalten sein sollten.

Warnung

CustomReflectionContext-Methoden sollten nicht direkt auf die Liste der Attribute eines reflektierten Objekts oder einer Methode zugreifen, indem sie die -Methode für das bereitgestellte MemberInfo oder ParameterInfo instance aufrufen, sondern stattdessen die declaredAttributes Liste verwenden, die als Parameter an die GetCustomAttributes Methodenüberladungen übergeben wird.GetCustomAttributes

Um einem reflektierten Typ Eigenschaften hinzuzufügen, überschreiben Sie die AddProperties -Methode. Die -Methode akzeptiert einen Parameter, der den reflektierten Typ angibt, und gibt eine Liste zusätzlicher Eigenschaften zurück. Sie sollten die CreateProperty -Methode verwenden, um Eigenschaftsobjekte zu erstellen, die zurückgegeben werden sollen. Sie können Delegatten angeben, wenn Sie die Eigenschaft erstellen, die als Eigenschaftszugriffsor dient, und Sie können einen der Accessoren weglassen, um eine schreibgeschützte oder schreibgeschützte Eigenschaft zu erstellen. Beachten Sie, dass solche Dummyeigenschaften keine Metadaten oder CIL-Unterstützung (Common Intermediate Language) aufweisen.

Warnung

Achten Sie beim Arbeiten mit Reflektionskontexten auf Gleichheit zwischen reflektierten Objekten, da Objekte dasselbe reflektierte Objekt in mehreren Kontexten darstellen können. Sie können die MapType -Methode verwenden, um die Version eines reflektierten Objekts für einen bestimmten Reflexionskontext abzurufen.

Warnung

Ein CustomReflectionContext -Objekt ändert die von einem bestimmten Reflexionsobjekt zurückgegebenen Attribute, z. B. die von der GetCustomAttributes -Methode abgerufenen Attribute. Die von der GetCustomAttributesData Methode zurückgegebenen benutzerdefinierten Attributdaten werden nicht geändert, und diese beiden Listen stimmen nicht überein, wenn Sie einen benutzerdefinierten Reflexionskontext verwenden.

Konstruktoren

CustomReflectionContext()

Initialisiert eine neue Instanz der CustomReflectionContext-Klasse.

CustomReflectionContext(ReflectionContext)

Initialisiert eine neue Instanz der CustomReflectionContext-Klasse mit der angegebenen Codebasis und Reflektionskontext als Grundlage

Methoden

AddProperties(Type)

Stellt beim Überschreiben in einer abgeleiteten Klasse eine Auflistung für zusätzliche Eigenschaften für den angegebenen Typ bereit, wie in diesem Reflexionskontext dargestellt.

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

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

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, der von der AddProperties(Type)-Methode verwendet werden soll und die angegebenen benutzerdefinierten Attribute verwendet.

Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.

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

Stellt beim Überschreiben in einer abgeleiteten Klasse eine Liste benutzerdefinierter Attribute für den angegebenen Member bereit, wie in diesem Reflexionskontext dargestellt.

GetCustomAttributes(ParameterInfo, IEnumerable<Object>)

Stellt beim Überschreiben in einer abgeleiteten Klasse eine Liste benutzerdefinierter Attribute für den angegebenen Parameter bereit, wie in diesem Reflexionskontext dargestellt.

GetHashCode()

Fungiert als Standardhashfunktion.

(Geerbt von Object)
GetType()

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
GetTypeForObject(Object)

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

(Geerbt von ReflectionContext)
MapAssembly(Assembly)

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

MapType(TypeInfo)

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

MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
ToString()

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

(Geerbt von Object)

Gilt für: