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

#.net #propertygrid #custom-attributes #expando #expandoobject

#.net #propertygrid #пользовательские атрибуты #расширение #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 .

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

РЕШЕНИЕ:

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

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

Ответ №1:

Проблема на самом деле в том, что отражение не работает должным образом для динамических типов.

PropertyGrid использует отражение для проверки свойств своего объекта и ExpandoObject не имеет никаких (статических) свойств.

Вы можете реализовать ICustomTypeDescriptor , чтобы «перехватить» отражение и запросить (динамические) свойства ExpandoObject . Код для DynamicTypeDescriptorWrapper в этом сообщении в блоге был бы хорошей отправной точкой.