是否可以向ExpandoObject实例的生成成员添加属性?

时间:2011-04-23 20:37:57

标签: .net propertygrid custom-attributes expando expandoobject

我正在尝试使用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的属性没有任何DisplayNameAttributeDescriptionAttribute或用于控制属性显示方式的任何其他属性PropertyGrid

我已经完成了一些阅读和一些谷歌搜索,我无法弄清楚是否有办法用自定义属性装饰ExpandoObject生成的属性。有谁知道如何做到这一点,或者更好的方式在ExpandoObject中展示PropertyGrid

SOLUTION:

@Stephen Cleary提供的答案是正确和有用的(谢谢,Stephen)。对于具有相同问题的其他人,实施ICustomTypeDescriptor对我来说非常有效。

作为旁注, 实现ICustomTypeDescriptor的对象为自身提供属性和事件描述符,而不是为另一个对象提供 。我认为描述符和描述的内容应该首先通过属性或某种东西相关联 - 对我来说,一个对象应该描述它自己的类型似乎令人困惑和多余,但这确实是PropertyGrid使用ICustomTypeDescriptor的方式。 1}} interface。

1 个答案:

答案 0 :(得分:6)

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

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

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