Можно ли добавить атрибуты к сгенерированным членам экземпляра 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 использовать ICustomTypeDescriptor интерфейс.

1 ответ

Решение

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

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

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

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