Получите PropertyDescriptors по умолчанию для типа - PullRequest
9 голосов
/ 10 апреля 2009

Я настраиваю отображение типа объекта в PropertyGrid, реализуя ICustomTypeDescriptor. Я разрешаю пользователю создавать свои собственные пользовательские свойства, которые хранятся в одном словаре ключей и значений. Я могу создать все PropertyDescriptors для этих значений и просмотреть их в сетке свойств. Однако я также хочу показать все свойства по умолчанию, которые в противном случае были бы показаны, если бы PropertyGrid был заполнен отражением, а не методом переопределения ICustomTypeDescriptor.GetProperties.

Теперь я знаю, как получить тип объекта, а затем GetProperties(), но это возвращает массив PropertyInfo, а не ProperyDescriptor. Так как же я могу преобразовать объект PropertyInfo типа в PropertyDescriptor объекты для включения в мою коллекцию с пользовательским PropertyDescriptors?

//gets the local intrinsic properties of the object
Type thisType = this.GetType();
PropertyInfo[] thisProps = thisType.GetProperties();

//this line obviously doesn't work because the propertydescriptor 
//collection needs an array of PropertyDescriptors not PropertyInfo
PropertyDescriptorCollection propCOl = 
    new PropertyDescriptorCollection(thisProps);

1 Ответ

15 голосов
/ 10 апреля 2009
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(thisType);

В качестве отступления: сюда не входят ваши ICustomTypeDescriptor настройки, но будет включать любые настройки, сделанные с помощью TypeDescriptionProvider.

(изменить) В качестве второго шага - вы также можете настроить PropertyGrid, указав TypeConverter - намного проще, чем ICustomTypeDescriptor или TypeDescriptionProvider - например:

[TypeConverter(typeof(FooConverter))]
class Foo { }

class FooConverter : ExpandableObjectConverter
{
    public override PropertyDescriptorCollection GetProperties(
       ITypeDescriptorContext context, object value, Attribute[] attributes)
    {
        // your code here, perhaps using base.GetPoperties(
        //    context, value, attributes);
    }
}
...