Вопрос

Рассмотрим следующий код.

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

Я пытаюсь понять разницу между A и B. Из того, что я понимаю, TypeDescriptor.GetProperties () вернет пользовательские свойства TypeDescriptor , где как Type.GetProperties () будет возвращать только встроенный " настоящий " свойства объекта. Это правильно? Если у obj нет пользовательских свойств TypeDescriptor , то по умолчанию он также возвращает буквальные внутренние свойства объекта.

<Ч>

* Original вторая строка кода перед EDIT (неверное возвращаемое значение):

  

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

Это было полезно?

Решение

obj.GetType (). GetProperties () не возвращает PropertyDescriptorCollection , он возвращает System.Reflection.PropertyInfo [] . Класс PropertyInfo , как вы предлагаете, представляет только реальные свойства, созданные для объекта. PropertyDescriptor является либо настраиваемым конкретным дочерним элементом класса PropertyDescriptor (реализуемым типом, определяющим настраиваемый дескриптор), либо является экземпляром закрытого внутреннего класса ReflectPropertyDescriptor. , который использует класс PropertyInfo для динамического вызова свойства.

Таким образом, для класса, который не определяет пользовательский дескриптор, вы функционально получите те же объекты обратно, хотя PropertyDescriptor абстрагирует PropertyInfo .

Другие советы

Класс TypeDescriptor используется в дизайнерах, чтобы они могли взаимодействовать со средой времени разработки. В частности, дизайнеры могут переопределять и расширять различные функции TypeDescriptor , но не Type .

Один хороший пример - работа с элементами управления с привязкой к данным. Свойство DataSource относится к типу System.Object , но во время разработки это свойство заменяется новым свойством с более богатым пользовательским интерфейсом во время разработки.

Класс TypeDescriptor возвращает объекты PropertyDescriptor , которые представляют свойства типа obj , а также любые другие свойства, которые были добавлены в сам объект или его тип.

Модель компонентов на самом деле довольно сложная, но, как вы описываете, базовая реализация TypeDescriptor.GetProperties () вернет ReflectPropertyDescriptor , которые представляют косвенное отношение к типичным объектам PropertyInfo . Вы можете использовать объекты PropertyDescriptor очень похоже на объекты PropertyInfo : они могут использоваться для получения и установки значения свойства, и у них есть атрибуты.

Для экземпляров DependencyObject в WPF TypeDescriptor.GetProperties () также возвращает вложенные свойства. Эти объекты PropertyDescriptor в этом случае обеспечивают косвенную привязку к объектной модели зависимости, а не к отражению.

В конструкторе компонентов можно использовать ICustomTypeDescriptor или TypeDescriptionProviderAttribute (и, возможно, некоторые другие методы) для создания собственных объектов PropertyDescriptor во время выполнения или во время разработки. В любом случае возможно, что свойства, возвращаемые из Type.GetProperties () , могут очень отличаться от свойств, возвращаемых из TypeDescriptor , в зависимости от контекста.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top