Можно ли добавить атрибуты к сгенерированным членам экземпляра ExpandoObject? - PullRequest
5 голосов
/ 24 апреля 2011

Я пытаюсь использовать 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?

РЕШЕНИЕ:

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

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

1 Ответ

6 голосов
/ 24 апреля 2011

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

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

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

...