Vue d'ensemble du descripteur de type

L'architecture TypeDescriptor améliore les fonctionnalités de la réflexion .NET.

Architecture du descripteur de type

L'architecture TypeDescriptor est basée sur le moteur de réflexion principal et ajoute des règles et des fonctionnalités supplémentaires. Par exemple, la classe TypeDescriptor prend en charge la fusion des propriétés extendeur d'un IContainer et prend également en charge le filtrage des propriétés et des événements via un IDesigner.

De plus, l'architecture TypeDescriptor active plusieurs fonctionnalités. Le tableau suivant présente les fonctionnalités de l'architecture.

Fonctionnalité

Description

Substitution d'instance

Autorise la création d'un type arbitraire lorsqu'un autre type est demandé.

Substitution de métadonnées

Autorise la modification des métadonnées d'un objet.

Redirection d'attribut

Autorise la spécification dynamique d'attributs.

Occultation et substitution de cible

Autorise un objet à en remplacer un autre.

Prise en charge du descripteur de type étendu

Autorise l'accès aux propriétés d'objet ajoutées par d'autres objets.

Pour prendre en charge ces fonctionnalités, la classe TypeDescriptor est étroitement associée aux diverses fonctionnalités du modèle de composant .NET Framework. Elle est compatible avec les objets COM, les fournisseurs d'extendeurs, les concepteurs et les propriétés CLR.

Notes

Vous pouvez utiliser l'architecture TypeDescriptor dans votre code au moment de l'exécution ainsi que dans votre code au moment du design.

Pour prendre en charge l'extensibilité, la classe TypeDescriptor dispose d'une classe associée appelée TypeDescriptionProvider et d'un attribut associé appelé TypeDescriptionProviderAttribute. Vous pouvez utiliser un TypeDescriptionProviderAttribute sur une classe afin d'introduire une façon complètement différente d'exposer des métadonnées satisfaisant vos objectifs de design.

Classe TypeDescriptionProvider

La classe TypeDescriptionProvider peut être considérée comme un plug-in pour la classe TypeDescriptor. Pour une instance particulière de TypeDescriptor, il peut y avoir plusieurs classes de fournisseur de description de type proposant toutes des métadonnées au TypeDescriptor.

Attribut TypeDescriptionProvider

TypeDescriptionProviderAttribute est un attribut que vous pouvez placer sur une classe. Cet attribut est utilisé pour indiquer qu'un fournisseur de description de type personnalisé est associé au type. L'attribut fournit à son tour un moyen d'installer, via les métadonnées, un fournisseur de description de type. Lorsque ce type est passé à une API quelconque sur la classe TypeDescriptor, TypeDescriptor découvre cet attribut, crée une instance du fournisseur de description de type qui y est décrit et raccorde le fournisseur aux tableaux internes de TypeDescriptor. Ensuite, TypeDescriptor poursuit le traitement de l'API. Le traitement permet à un type d'installer automatiquement un fournisseur de description de type personnalisé à la demande.

Fonctionnalités du descripteur de type

L'architecture TypeDescriptor active des fonctionnalités en plus de celles fournies par la réflexion .NET Framework.

Substitution d'instance

La substitution d'instance a lieu lorsque vous souhaitez créer un type, mais que le type réellement créé est différent de ce que vous aviez demandé. La substitution d'instance est réalisée lorsque vous remplacez tous les appels à new par des appels à la méthode CreateInstance. Dans les tableaux internes du TypeDescriptor, cette méthode recherche un objet TypeDescriptionProvider associé au type de données fourni. Si elle en trouve un, elle délègue l'appel à cet objet.

Substitution de métadonnées

La substitution de métadonnées a lieu lorsque vous souhaitez modifier les métadonnées disponibles pour un ou plusieurs objets. Une application courante de la substitution de métadonnées concerne l'implémentation de concepteurs. La substitution de métadonnées peut être réalisée avec les fournisseurs de description de type qui peuvent être ajoutés et supprimés à l'aide des méthodes suivantes sur TypeDescriptor :

Redirection d'attribut

Il existe quelques cas dans le modèle objet .NET Framework où le type d'une propriété est délibérément conçu pour être non spécifique. Par exemple, la propriété DataSource sur la classe DataGridView est de type object. Cette conception permet à la source de données d'accepter plusieurs types d'entrées, mais elle ne fournit aucun emplacement commun pour ajouter les métadonnées afin de décrire les caractéristiques de la propriété. Dans le .NET Framework, chaque propriété de la source de données doit avoir des métadonnées identiques pour les convertisseurs de type et les éditeurs de types munis d'une interface utilisateur.

La classe AttributeProviderAttribute répond à cette situation. Lorsque cet attribut est placé sur une propriété, les règles changent afin d'obtenir des attributs pour la collection Attributes du descripteur de propriété. Généralement, le descripteur de propriété rassemble des attributs locaux et les fusionne avec des attributs du type de propriété. Lorsque l'attribut AttributeProviderAttribute est appliqué, les attributs sont extraits du type retourné par AttributeProviderAttribute, et non du type de propriété réel. AttributeProviderAttribute est utilisé sur les sources de données pour pointer le type spécifique de la source de données vers IListSource et les métadonnées appropriées sont placées sur IListSource pour activer la liaison de données. Cette redirection permet aux parties externes telles que Visual Studio d'ajouter facilement des métadonnées à toutes les sources de données.

Les attributs obtenus à partir d'un type déclaré dans AttributeProviderAttribute disposent d'une priorité entre les attributs du type de la propriété et les attributs sur la propriété. L'ensemble des attributs disponibles est la fusion, par ordre de priorité, comme indiqué dans la liste suivante :

  1. Attributs de la propriété

  2. Attributs du fournisseur d'attributs

  3. Attributs du type de propriété

Occultation et substitution de cible

La substitution de cible a lieu lorsqu'un objet en remplace un autre. Une application courante de la substitution de cible concerne l'implémentation de concepteurs.

Dans l'architecture du Concepteur .NET Framework, un concepteur peut être associé à un composant. Ce concepteur peut implémenter IDesignerFilter et fournir ses propres propriétés. Ces propriétés sont fusionnées dans la propriété définie pour le composant auquel le concepteur est associé. Ces propriétés peuvent être nouvelles pour le composant. Elles peuvent également avoir le même nom et être du même type que les propriétés déjà définies sur le composant. Lorsque la nouvelle propriété partage le nom et le type d'une propriété existante, elle est appelée occultante car le concepteur masque, ou occulte, la propriété existante sur le composant. L'illustration suivante montre l'occultation d'une propriété.

Propriété d'occultation du texte

Dans le cas présent, le composant expose deux propriétés et le concepteur expose également deux propriétés. La propriété Text est exposée aussi bien sur le concepteur que sur le composant et elle est occultée. Trois propriétés constituent le résultat final d'un appel à GetProperties. L'une d'elles existe sur le composant et les deux autres existent sur le concepteur.

Ce filtrage de propriété est accompli via l'utilisation de ITypeDescriptorFilterService, que l'aire de conception implémente. Les fonctions TypeDescriptor sont obligatoires lorsqu'il faut définir une valeur sur la propriété. Le code permettant d'attribuer une valeur à la propriété Grid se présenterait de la manière suivante :

    gridProp.SetValue(component, value);

Les informations de type réelles concernant la propriété pointent celle-ci vers une instance du concepteur, non du composant. Si un appel de réflexion était effectué pour définir réellement la propriété, l'appel lèverait une exception d'appel cible car l'instance de composant ne correspond pas au type de concepteur.

La classe TypeDescriptor dispose d'une logique inhérente pour éviter cette situation. Lorsqu'un appel de propriété est effectué, la classe TypeDescriptor contrôle si le type de membre est une instance de l'objet passé. Si c'est le cas, elle laisse l'appel se poursuivre. Sinon, la classe tente de localiser le concepteur pour l'objet et, si le concepteur peut être trouvé et qu'il est du type correct, la classe remplace l'instance de composant par l'instance de concepteur.

Les méthodes suivantes sur TypeDescriptor prennent en charge la substitution de cible :

Prise en charge du descripteur de type étendu

La méthode GetExtendedTypeDescriptor retourne un descripteur de type personnalisé étendu pour l'objet donné. Un descripteur de type étendu est un descripteur de type personnalisé qui expose des propriétés que d'autres objets ont ajouté à cet objet mais qui ne sont pas réellement définies sur l'objet. Par exemple, dans le modèle de composant .NET Framework, les objets qui implémentent l'interface IExtenderProvider peuvent attacher des propriétés à d'autres objets qui résident dans le même IContainer. La méthode GetTypeDescriptor ne retourne pas un descripteur de type qui fournit ces propriétés étendues supplémentaires, mais GetExtendedTypeDescriptor retourne l'ensemble de ces propriétés étendues. La classe TypeDescriptor fusionne automatiquement les résultats de ces deux collections de propriétés.

Notes

Bien que le modèle de composant .NET Framework prenne uniquement en charge des propriétés étendues, GetExtendedTypeDescriptor peut également être utilisé pour les attributs et les événements étendus si le fournisseur de description de type les prend en charge.

Voir aussi

Référence

TypeDescriptor

TypeDescriptionProvider

TypeDescriptionProviderAttribute

ICustomTypeDescriptor

CustomTypeDescriptor

IContainer

IDesigner

Autres ressources

Extension de la prise en charge au moment du design