#.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
в этом сообщении в блоге был бы хорошей отправной точкой.