Il y a un chevauchement distinct entre ce que vous pouvez faire avec les deux. La reflection ComponentModel est-elle simplement une couche un peu plus conviviale sur System.Reflection?
Non, il y a plus. ComponentModel vous permet d’effectuer quelques opérations de type DLR, telles que les propriétés d’exécution. Voici comment un DataView expose les colonnes à une grid – ce ne sont pas des propriétés de reflection – mais des propriétés d’exécution. Les mots clés ICustomTypeDescriptor
ici sont ICustomTypeDescriptor
et TypeDescriptionProvider
.
Ce modèle permet également l’abstraction et l’indirection. Par exemple, si vous réfléchissez beaucoup sur les propriétés, considérez HyperDescriptor . C’est un utilitaire que j’ai écrit qui utilise une implémentation personnalisée de PropertyDescriptor
pour échanger le modèle de reflection contre un modèle précompilé et d’énormes gains de performances.
En termes d’utilisation, il existe d’autres différences. ComponentModel ne prend en charge qu’une seule instance d’un atsortingbut sur un membre (contrairement à la reflection, où plusieurs atsortingbuts identiques sont autorisés). Et il est centré sur les données – il existe donc des propriétés, de même que des événements (principalement destinés à la notification de modification) – mais il n’y a pas de champs ni de méthodes.
Il prend également en charge i18n, car le nom d’affichage, etc. peut être personnalisé à la volée.
Cependant, ComponentModel n’est pas (directement) compatible avec des choses comme LINQ (MemberExpression en particulier), car cela veut se lier à des données de reflection.
Enfin, ComponentModel est très utilisé dans Property ID par des propriétés telles que PropertyGrid (comme les propriétés supplémentaires pour les info-bulles), mais presque toutes les liaisons de données d’UI se font via ComponentModel (car cela permet à la liaison de prendre en charge DataTable, les classes et tout ce que vous pouvez penser).