我想将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
中吗?
解决方案:
@Stephen Cleary提供的答案是正确和有帮助的(谢谢,Stephen)。对于其他遇到同样问题的人,实现ICustomTypeDescriptor
对我来说完美地解决了问题。
顺便说一下,实现ICustomTypeDescriptor
的对象为自己提供属性和事件描述符,而不是另一个对象。一开始我以为描述符和描述的东西应该通过某种属性之类的东西链接在一起 - 对我来说,一个对象应该描述自己的类型似乎有些混淆和多余,但这确实是PropertyGrid
如何使用ICustomTypeDescriptor
接口。