Это Можно ли добавить атрибуты к сгенерированным членам экземпляра ExpandoObject?

Я пытаюсь использовать ExpandoObject в качестве SelectedObject PropertyGrid. Я знаю, как добавить свойства, которые я хочу в ExpandoObject:

public dynamic MakePropertyObject()
{
    dynamic expando = new ExpandoObject();
    var dictionary = expando as IDictionary<string, object>;
    foreach(MyClass m in PropertiesINeedToAdd)
        dictionary[m.Name] = m.Value;
    return expando;
}

Этот код работает нормально - отладчик показывает имена и значения свойств expando , как и ожидалось.

Однако ни одно из сгенерированные свойства отображаются в PropertyGrid, когда я устанавливаю возвращаемое значение MakePropertyObject () для его свойства SelectedObject . Я предполагаю (возможно, ошибочно), что это связано с тем, что свойства ExpandoObject не имеют атрибутов DisplayNameAttribute , DescriptionAttribute или каких-либо других атрибутов, используемых для контролировать способ отображения свойств в PropertyGrid .

I ' Я прочитал и погуглил, и я не могу понять, есть ли способ украсить сгенерированные свойства ExpandoObject настраиваемыми атрибутами. Кто-нибудь знает, как это можно сделать, или как лучше показать ExpandoObject в PropertyGrid ?

РЕШЕНИЕ:

Ответ, предоставленный @Stephen Cleary, был правильно и полезно (спасибо, Стивен). Для других с той же проблемой реализация ICustomTypeDescriptor отлично сработала для меня.

В качестве примечания: объект, реализующий ICustomTypeDescriptor , предоставляет дескрипторы свойств и событий для себя , а не для другого объекта . Я думал, что дескриптор и описываемое должны быть связаны атрибутом или чем-то вначале - мне казалось сбивающим с толку и избыточным, что объект должен описывать свой собственный тип, но именно так PropertyGrid s используют Интерфейс ICustomTypeDescriptor .

5
задан Michael Hoffmann 25 April 2011 в 02:53
поделиться