2011-04-23 68 views
5

我想使用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接口的。

回答

6

问题实际上是反射在预期的动态类型上无法正常工作。

PropertyGrid使用反射来检查其对象的属性,ExpandoObject没有任何(静态)属性。

您可以实现ICustomTypeDescriptor以“劫持”反射并查询ExpandoObject的(动态)属性。代码DynamicTypeDescriptorWrapperthis blog post将是一个很好的起点。

相关问题