5

我正在尝试使用 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用自定义属性装饰生成的属性。有谁知道如何做到这一点,或者有更好的方式来显示ExpandoObjecta PropertyGrid

解决方案:

@Stephen Cleary 提供的答案是正确且有帮助的(感谢 Stephen)。对于其他有同样问题的人,实施ICustomTypeDescriptor对我来说非常有效。

作为旁注,实现的对象ICustomTypeDescriptor为自己提供属性和事件描述符,而不是为另一个对象提供。我认为描述符和所描述的内容最初应该通过属性或其他东西链接 - 对象应该描述自己的类型对我来说似乎令人困惑和多余,但这确实是PropertyGrids 使用ICustomTypeDescriptor接口的方式。

4

1 回答 1

7

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

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

您可以实现ICustomTypeDescriptor“劫持”反射并查询ExpandoObject. 这篇博DynamicTypeDescriptorWrapper文中的代码将是一个很好的起点。

于 2011-04-23T23:31:06.680 回答