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 Sie unterklassen CustomReflectionContext ein benutzerdefiniertes Attribut allen Membern eines bestimmten Typs hinzufügen, deren Namen mit "An" beginnen. Um diesen Code auszuführen, fügen Sie ihn in ein leeres Konsolenprojekt ein, und stellen Sie sicher, dass sie einen Verweis auf System.Reflection.Context.dll enthält.

//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 von benutzerdefinierten Attributen aus Spiegelungsobjekten oder zum Hinzufügen von Dummy-Eigenschaften zu diesen Objekten, ohne das vollständige Spiegelungsmodell erneut zu implementieren. Die Standardeinstellung CustomReflectionContext umschließt einfach Spiegelungsobjekte, ohne Änderungen vorzunehmen, aber durch Unterklassifizierung und Außerkraftsetzung der relevanten Methoden können Sie die Attribute hinzufügen, entfernen oder ändern, die auf einen reflektierten Parameter oder Element angewendet werden, oder neue Eigenschaften zu einem reflektierten Typ hinzufügen, entfernen oder ändern.

Angenommen, Ihr Code folgt der Konvention, ein bestimmtes Attribut auf Factorymethoden anzuwenden, aber Sie müssen jetzt mit Drittanbietercode arbeiten, der keine Attribute enthält. Sie können eine CustomReflectionContext Regel zum Identifizieren der Objekte angeben, die Attribute aufweisen sollen, und die Objekte mit diesen Attributen angeben, wenn sie aus Ihrem Code angezeigt werden.

Um effektiv zu verwenden CustomReflectionContext , muss der Code, der die reflektierten Objekte verwendet, den Begriff der Angabe eines Spiegelungskontexts unterstützen, anstatt davon zu ausgehen, dass alle spiegelnden Objekte dem Laufzeitreflektionskontext zugeordnet sind. Viele Spiegelungsmethoden in der .NET Framework stellen hierfür einen ReflectionContext Parameter bereit.

Wenn Sie die Attribute ändern möchten, die auf einen reflektierten Parameter oder ein Element angewendet werden, überschreiben Sie die GetCustomAttributes(ParameterInfo, IEnumerable<Object>) Methode GetCustomAttributes(MemberInfo, IEnumerable<Object>) . Diese Methoden übernehmen das reflektierte Objekt und die Liste der Attribute im aktuellen Spiegelungskontext und geben die Liste der Attribute zurück, die sie im benutzerdefinierten Spiegelungskontext haben soll.

Warnung

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

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 zum Erstellen von Eigenschaftsobjekten verwenden, um zurückzugeben. Sie können Stellvertretungen angeben, wenn Sie die Eigenschaft erstellen, die als Eigenschaftszugriffsor dient, und Sie können einen der Accessoren auslassen, um eine schreibgeschützte oder schreibgeschützte Eigenschaft zu erstellen. Beachten Sie, dass solche Dummy-Eigenschaften keine Metadaten oder common Intermediate Language (CIL) sichern.

Warnung

Seien Sie vorsichtig bei der Gleichheit zwischen spiegelnden Objekten, wenn Sie mit Spiegelungskontexten arbeiten, da Objekte dasselbe spiegelungsbezogene Objekt in mehreren Kontexten darstellen können. Sie können die Methode verwenden, um die MapType Version eines bestimmten Spiegelungskontexts eines widerspiegelten Objekts abzurufen.

Warnung

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.

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