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

Mic*_*ann 5 .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;
}
Run Code Online (Sandbox Code Playgroud)

此代码工作正常 - 调试器expando按预期显示属性的名称和值.

然而,没有生成的属性被显示出来PropertyGrid中的当我设置的返回值MakePropertyObject()到它的SelectedObject属性.我认为(也许是错误地),这是因为ExpandoObject的属性没有任何DisplayNameAttribute,DescriptionAttribute或任何用于控制其他属性如何属性显示在一个PropertyGrid.

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

解:

@Stephen Cleary提供的答案是正确和有用的(谢谢,斯蒂芬).对于有同样问题的其他人来说,实施ICustomTypeDescriptor对我来说非常合适.

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

Ste*_*ary 6

问题实际上是反射在动态类型上不能按预期工作.

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

您可以实现ICustomTypeDescriptor"劫持"反射并查询(动态)属性ExpandoObject.为代码DynamicTypeDescriptorWrapper这篇博客文章将是一个很好的起点.