我正在尝试使用ExpandoObject作为PropertyGrid的SelectedObject。我知道如何将我想要的属性添加到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
属性的名称和值。
但是,当我将MakePropertyObject()
的返回值设置为SelectedObject
属性时,PropertyGrid中没有显示任何生成的属性。我假设(可能是错误的)这是因为ExpandoObject
的属性没有任何DisplayNameAttribute
,DescriptionAttribute
或用于控制属性显示方式的任何其他属性PropertyGrid
。
我已经完成了一些阅读和一些谷歌搜索,我无法弄清楚是否有办法用自定义属性装饰ExpandoObject
生成的属性。有谁知道如何做到这一点,或者更好的方式在ExpandoObject
中展示PropertyGrid
?
SOLUTION:
@Stephen Cleary提供的答案是正确和有用的(谢谢,Stephen)。对于具有相同问题的其他人,实施ICustomTypeDescriptor
对我来说非常有效。
作为旁注, 实现ICustomTypeDescriptor
的对象为自身提供属性和事件描述符,而不是为另一个对象提供 。我认为描述符和描述的内容应该首先通过属性或某种东西相关联 - 对我来说,一个对象应该描述它自己的类型似乎令人困惑和多余,但这确实是PropertyGrid
使用ICustomTypeDescriptor
的方式。 1}} interface。
答案 0 :(得分:6)
问题实际上是反射在动态类型上无法正常工作。
PropertyGrid
使用反射来检查其对象的属性,ExpandoObject
没有任何(静态)属性。
您可以实现ICustomTypeDescriptor
来“劫持”反射并查询ExpandoObject
的(动态)属性。 this blog post中DynamicTypeDescriptorWrapper
的代码将是一个很好的起点。