我想使用ExpandoObject作为PropertyGrid的SelectedObject。我知道如何我想要的属性添加到ExpandoObject:是否可以向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
生成的属性。有没有人知道如何做到这一点,或者更好的方式在PropertyGrid
中显示ExpandoObject
?
SOLUTION:
由@Stephen克利里提供的答案是正确的和有帮助的(感谢,斯蒂芬)。对于有同样问题的其他人,实施ICustomTypeDescriptor
对我来说非常合适。
作为一个侧面说明,实现ICustomTypeDescriptor
的对象提供了属性和事件描述符本身,而不是另一个对象。我认为描述符和描述应该首先通过一个属性或某种东西相关联 - 对于我来说,一个对象应该描述它自己的类型似乎令人困惑和多余,但这确实是如何使用ICustomTypeDescriptor
接口的。