我正在尝试使用 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()
为其属性时,PropertyGrid 中没有显示任何生成的SelectedObject
属性。我假设(可能是错误的)这是因为ExpandoObject
的属性没有任何DisplayNameAttribute
,DescriptionAttribute
或任何其他用于控制属性在PropertyGrid
.
我做了一些阅读和一些谷歌搜索,我不知道是否有办法ExpandoObject
用自定义属性装饰生成的属性。有谁知道如何做到这一点,或者有更好的方式来显示ExpandoObject
a PropertyGrid
?
解决方案:
@Stephen Cleary 提供的答案是正确且有帮助的(感谢 Stephen)。对于其他有同样问题的人,实施ICustomTypeDescriptor
对我来说非常有效。
作为旁注,实现的对象ICustomTypeDescriptor
为自己提供属性和事件描述符,而不是为另一个对象提供。我认为描述符和所描述的内容最初应该通过属性或其他东西链接 - 对象应该描述自己的类型对我来说似乎令人困惑和多余,但这确实是PropertyGrid
s 使用ICustomTypeDescriptor
接口的方式。