Разница между отражением ComponentModel (например, PropertyDescriptor) и стандартным отражением (например, PropertyInfo)? - PullRequest
26 голосов
/ 19 ноября 2008

Существует явное совпадение между тем, что вы можете сделать с ними обоими. Является ли материал отражения ComponentModel просто более дружественным слоем поверх System.Reflection?

1 Ответ

30 голосов
/ 19 ноября 2008

Нет - есть еще. ComponentModel позволяет вам делать несколько вещей типа DLR, таких как свойства времени выполнения. Вот как DataView предоставляет столбцы в сетку - они не являются свойствами отражения - они являются свойствами времени выполнения. Ключевые слова здесь ICustomTypeDescriptor и TypeDescriptionProvider.

Эта модель также допускает абстракцию и косвенность. Например, если вы много размышляете о свойствах, рассмотрите HyperDescriptor - это утилита, которую я написал, которая использует собственную реализацию PropertyDescriptor для замены модели отражения на предварительно скомпилированную модель, для огромный рост производительности.

С точки зрения использования, есть некоторые другие различия; ComponentModel поддерживает только один экземпляр любого атрибута на элементе (в отличие от отражения, где допускается несколько одинаковых атрибутов). И он ориентирован на данные - поэтому существуют свойства, как и события (в первую очередь предназначенные для уведомления об изменениях), но нет ни полей, ни методов.

Он также имеет хорошую поддержку i18n - поскольку DisplayName и т. Д. Можно настраивать на лету.

Однако ComponentModel (напрямую) не совместим с такими вещами, как LINQ (в частности, с MemberExpression) - так как это требует привязки к данным отражения.

Наконец, ComponentModel широко используется в IDE такими вещами, как PropertyGrid (именно так работают такие вещи, как дополнительные свойства для подсказок), но в равной степени почти вся привязка данных пользовательского интерфейса происходит через ComponentModel (поскольку это позволяет связыванию поддерживать DataTable, классы и все, что только можно придумать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...