Question

Considérez le code suivant.

Object obj;
PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj);
PropertyInfo[] B = obj.GetType().GetProperties(); // EDIT*

J'essaie de comprendre la différence entre A et B. D'après ce que je comprends, TypeDescriptor.GetProperties () renverra des propriétés TypeDescriptor personnalisées, où Type.GetProperties () ne renvoie que les expressions intrinsèques "réel" et "réel". propriétés de l'objet. Est-ce correct? Si obj ne possède pas de propriétés TypeDescriptor personnalisées, il renvoie simplement par défaut le retour des propriétés intrinsèques littérales de l'objet.

* Original deuxième ligne de code avant EDIT (valeur renvoyée incorrecte):

  

PropertyDescriptorCollection B = obj.GetType (). GetProperties ();

Était-ce utile?

La solution

obj.GetType (). GetProperties () ne renvoie pas un PropertyDescriptorCollection , mais un System.Reflection.PropertyInfo [] . Comme vous le suggérez, la classe PropertyInfo ne représente que les propriétés réelles créées sur l'objet. Un PropertyDescriptor est soit un enfant concret personnalisé de la classe PropertyDescriptor (implémenté par le type définissant le descripteur personnalisé), soit une instance de la classe interne scellée ReflectPropertyDescriptor qui utilise la classe PropertyInfo pour fournir un appel dynamique de la propriété.

Donc, pour une classe qui ne définit pas de descripteur personnalisé, vous obtiendrez fonctionnellement les mêmes objets, bien que le PropertyDescriptor fasse abstraction de PropertyInfo .

Autres conseils

La classe TypeDescriptor est utilisée par les concepteurs afin qu'ils puissent interagir avec l'environnement de conception. En particulier, les concepteurs peuvent remplacer et étendre diverses fonctionnalités de TypeDescriptor , mais pas Type .

Un bon exemple consiste à utiliser des contrôles liés aux données. La propriété DataSource est de type System.Object , mais au moment du design, cette propriété est remplacée par une nouvelle propriété qui possède une interface utilisateur plus riche au moment du design.

La classe TypeDescriptor renvoie des objets PropertyDescriptor qui représentent les propriétés dans le type de obj , ainsi que toutes les autres propriétés ayant contribué au projet. objet lui-même ou à son type.

Le modèle de composant est en fait assez complexe, mais comme vous l'avez décrit, l'implémentation de base de TypeDescriptor.GetProperties () renverra ReflectPropertyDescriptor qui représentent une indirection vers des objets PropertyInfo typiques. Vous pouvez utiliser des objets PropertyDescriptor très similaires aux objets PropertyInfo : ils peuvent être utilisés pour obtenir et définir la valeur de la propriété et ils ont des attributs.

Pour les instances DependencyObject dans WPF, TypeDescriptor.GetProperties () renvoie également les propriétés attachées. Ces objets PropertyDescriptor fournissent dans ce cas une indirection vers le modèle d'objet de dépendance plutôt que vers la réflexion.

Dans le concepteur de composants, il est possible d'utiliser ICustomTypeDescriptor ou TypeDescriptionProviderAttribute (et peut-être d'autres techniques) pour créer vos propres objets PropertyDescriptor . à l'exécution ou à la conception. Dans tous les cas, il est possible que les propriétés renvoyées par Type.GetProperties () soient très différentes de celles renvoyées par TypeDescriptor , en fonction du contexte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top