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