Разница между отражением ComponentModel (например, PropertyDescriptor) и стандартным отражением (например, PropertyInfo)?

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

1 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам