Übersicht über den Typdeskriptor
Aktualisiert: November 2007
Die Funktionen von .NET-Reflexion werden durch die TypeDescriptor-Architektur erweitert.
Typdeskriptorarchitektur
Die TypeDescriptor-Architektur stützt sich auf das Kernmodul von Reflexion und fügt weitere Regeln und Features hinzu. Beispielsweise unterstützt die TypeDescriptor-Klasse das Zusammenführen von Extendereigenschaften aus einem IContainer sowie das Filtern von Eigenschaften und Ereignissen über einen IDesigner.
Außerdem aktiviert die TypeDescriptor-Architektur mehrere Funktionen. Diese Funktionen werden in der folgenden Tabelle angezeigt.
Funktion |
Beschreibung |
---|---|
Instanzersetzung |
Ermöglicht das Erstellen eines beliebigen Typs, wenn ein anderer Typ angefordert wird. |
Metadatenersetzung |
Ermöglicht die Änderung von Metadaten eines Objekts. |
Attributumleitung |
Ermöglicht die dynamische Angabe von Attributen. |
Zielersetzung und Shadowing |
Ermöglicht das Ersetzen eines Objekts durch ein anderes. |
Erweiterte Typdeskriptorunterstützung |
Ermöglicht den Zugriff auf Objekteigenschaften, die von anderen Objekten hinzugefügt wurden. |
Um diese Features zu unterstützen, ist die TypeDescriptor-Klasse fest in die zahlreichen Features des Komponentenmodells von .NET Framework integriert. Die Klasse ist mit COM-Objekten, Extenderanbietern, Designern und CLR-Eigenschaften kompatibel.
Hinweis: |
---|
Sie können die TypeDescriptor-Architektur im Laufzeitcode und im Entwurfszeitcode verwenden. |
Um die Erweiterbarkeit zu unterstützen, verfügt die TypeDescriptor-Klasse über eine Assistentenklasse mit dem Namen TypeDescriptionProvider sowie über ein Begleitattribut mit dem Namen TypeDescriptionProviderAttribute. Sie können ein TypeDescriptionProviderAttribute für eine Klasse verwenden, um die Ihren Entwurfszielen entsprechenden Metadaten auf eine vollkommen neue Art und Weise verfügbar zu machen.
TypeDescriptionProvider-Klasse
Die TypeDescriptionProvider-Klasse kann als Plug-In für die TypeDescriptor-Klasse betrachtet werden. Für eine bestimmte Instanz von TypeDescriptor können mehrere Typbeschreibungs-Anbieterklassen zur Verfügung stehen, die TypeDescriptor allesamt Metadaten anbieten.
TypeDescriptionProvider-Attribut
Das TypeDescriptionProviderAttribute ist ein Attribut, das Sie für eine Klasse platzieren können. Dieses Attribut wird verwendet, um anzugeben, dass dem Typ ein benutzerdefinierter Typbeschreibungsanbieter zugeordnet ist. Das Attribut bietet eine Möglichkeit, mithilfe von Metadaten einen Typbeschreibungsanbieter zu installieren. Wenn dieser Typ an eine beliebige API für die TypeDescriptor-Klasse übergeben wird, dann ermittelt TypeDescriptor das Attribut, erstellt eine Instanz des in diesem Attribut beschriebenen Typbeschreibungsanbieters und verknüpft den Anbieter mit den internen Tabellen von TypeDescriptor. Danach setzt TypeDescriptor die Verarbeitung der API fort. Die Verarbeitung ermöglicht es einem Typ, einen benutzerdefinierten Typbeschreibungsanbieter nach Bedarf automatisch zu installieren.
Typdeskriptorfunktionen
Mit der TypeDescriptor-Architektur werden Funktionen angeboten, die über die von .NET Framework-Reflexion hinausgehen.
Instanzersetzung
Instanzersetzung tritt auf, wenn Sie einen Typ erstellen möchten, aber der tatsächlich erstellte Typ nicht dem von Ihnen angeforderten Typ entspricht. Instanzersetzung wird ausgeführt, wenn Sie alle Aufrufe von new durch Aufrufe der CreateInstance-Methode ersetzen. Diese Methode sucht in internen Tabellen innerhalb von TypeDescriptor nach einem TypeDescriptionProvider-Objekt, das mit dem gegebenen Datentyp verknüpft ist. Sofern die Methode fündig wird, delegiert sie den Aufruf an dieses Objekt.
Metadatenersetzung
Metadatenersetzung tritt auf, wenn Sie die für ein oder mehrere Objekte zur Verfügung stehenden Metadaten ändern möchten. Metadatenersetzung wird häufig bei Implementierungen von Designern angewendet. Sie kann mithilfe von Typbeschreibungsanbietern ausgeführt werden, die unter Verwendung der folgenden Methoden für TypeDescriptor hinzugefügt und entfernt werden können:
Attributumleitung
Es gibt nur wenige Fälle im Objektmodell von .NET Framework, bei denen der Eigenschaftentyp absichtlich nicht spezifiziert worden ist. Zum Beispiel wird die DataSource-Eigenschaft für die DataGridView-Klasse als object eingegeben. Durch dieses Design kann die Datenquelle mehrere Eingabearten akzeptieren, es bietet aber keine generelle Möglichkeit des Hinzufügens von Metadaten zur Beschreibung der Eigenschaftenmerkmale. Jede Datenquelleneigenschaft innerhalb von .NET Framework muss über identische Metadaten für Typkonverter, Benutzeroberfläche (UI) und Typ-Editoren verfügen.
Für eine derartige Situation wurde die AttributeProviderAttribute-Klasse konzipiert. Sobald das Attribut in einer Eigenschaft abgelegt wird, gelten andere Regeln für das Abrufen von Attributen für die Attributes-Auflistung des Eigenschaftendeskriptors. I. d. R. erfasst der Eigenschaftendeskriptor lokale Attribute und führt diese dann mit Attributen des Eigenschaftentyps zusammen. Wenn das AttributeProviderAttribute-Attribut angewendet wird, werden die Attribute anstatt vom eigentlichen Eigenschaftentyp von dem Typ übernommen, der von AttributeProviderAttribute zurückgegeben wurde. Dieses AttributeProviderAttribute wird in den Datenquellen verwendet, um der IListSource den spezifischen Typ der Datenquelle anzuzeigen. Die entsprechenden Metadaten werden in der IListSource abgelegt, um die Datenbindung zu ermöglichen. Durch diese Umleitung können externe Programme wie Visual Studio allen Datenquellen Metadaten ohne großen Aufwand hinzufügen.
Attribute, die von einem in AttributeProviderAttribute deklarierten Typ abgerufen wurden, werden bei den Attributen vom Typ der Eigenschaft und den Attributen in der Eigenschaft prioritär behandelt. Alle zur Verfügung stehenden Attribute sind in der nach Priorität geordneten Zusammenführung enthalten, wie in der folgenden Tabelle gezeigt:
Eigenschaftenattribute
Attributanbieterattribute
Eigenschaftentypattribute
Zielersetzung und Shadowing
Zielersetzung tritt auf, wenn ein Objekt durch ein anderes ersetzt wird. Die Zielersetzung wird häufig in Implementierungen von Designern angewendet.
In der .NET Framework-Designerarchitektur kann einem Designer eine Komponente zugeordnet sein. Dieser Designer kann IDesignerFilter implementieren und seine eigenen Eigenschaften bereitstellen. Diese Eigenschaften werden mit dem Eigenschaftensatz für die Komponente zusammengeführt, die dem Designer zugeordnet ist. Die Eigenschaften können für die Komponente neu sein. Sie können auch vom gleichen Typ sein und denselben Namen haben wie Eigenschaften, die bereits für die Komponente definiert sind. Sollte die neue Eigenschaft Namen und Typ mit einer bereits vorhandenen Eigenschaft gemein haben, wird dies Shadowing genannt, da der Designer die vorhandene Eigenschaft für die Komponente ausblendet, d.h. für diese Eigenschaft das Shadowing durchführt. Das Shadowing für eine Eigenschaft wird im Folgenden veranschaulicht.
Hier werden sowohl von der Komponente als auch vom Designer zwei Eigenschaften angeboten. In der Komponente und im Designer wird die Text-Eigenschaft angeboten, für die Shadowing durchgeführt wird. Durch Aufrufen von GetProperties erhält man drei Eigenschaften als Endergebnis. Davon sind eine in der Komponente, die anderen zwei im Designer enthalten.
Dieses Filtern von Eigenschaften geschieht mithilfe von ITypeDescriptorFilterService, das durch die Entwurfsoberfläche implementiert wird. TypeDescriptor-Funktionen sind dann erforderlich, wenn der Zeitpunkt gekommen ist, für die Eigenschaft einen Wert festzulegen. Der für die Grid-Eigenschaft zu verwendende Code sähe folgendermaßen aus:
gridProp.SetValue(component, value);
Die aktuelle Typinformation über die Eigenschaft verweist diese nicht an die Komponente, sondern an eine Instanz des Designers. Falls Sie Reflexion zum Festlegen der Eigenschaft aufrufen, wird eine Zielaufrufausnahme ausgelöst, da die Komponenteninstanz nicht dem Designertyp entspricht.
Um mit dieser Situation richtig umzugehen, verfügt die TypeDescriptor-Klasse über eine inhärente Logik. Bei einem Eigenschaftenaufruf prüft die TypeDescriptor-Klasse, ob der Membertyp eine Instanz des übergebenen Objekts ist. Sofern dies zutrifft, wird der Aufruf weiter ausgeführt. Trifft dies aber nicht zu, versucht die Klasse, den Designer für das Objekt zu finden. Ist sie erfolgreich, und weist der Designer den richtigen Typ auf, ersetzt die Klasse die Komponenteninstanz durch die Designerinstanz.
Die folgenden Methoden für TypeDescriptor unterstützen die Zielersetzung:
Erweiterte Typdeskriptorunterstützung
Die GetExtendedTypeDescriptor-Methode gibt für das gegebene Objekt einen erweiterten, benutzerdefinierten Typdeskriptor zurück. Ein erweiterter Typdeskriptor ist ein benutzerdefinierter Typdeskriptor mit Eigenschaften, die diesem Objekt von anderen Eigenschaften hinzugefügt wurden, aber eigentlich nicht für das Objekt definiert sind. Im Komponentenmodell von .NET Framework können beispielsweise Objekte, die die IExtenderProvider-Schnittstelle implementieren, Eigenschaften anderen Objekten hinzufügen, die sich im gleichen IContainer befinden. Die GetTypeDescriptor-Methode gibt keinen Typdeskriptor zurück, der diese zusätzlich erweiterten Eigenschaften bereitstellt. Ein Satz solcher erweiterter Eigenschaften wird von GetExtendedTypeDescriptor zurückgegeben. Die TypeDescriptor-Klasse führt die Ergebnisse dieser beiden Eigenschaftenauflistungen automatisch zusammen.
Hinweis: |
---|
Obwohl das Komponentenmodell von .NET Framework nur erweiterte Eigenschaften unterstützt, kann auch GetExtendedTypeDescriptor für erweiterte Attribute und Ereignisse verwendet werden, wenn dies vom Typbeschreibungsanbieter unterstützt wird. |
Siehe auch
Referenz
TypeDescriptionProviderAttribute