winform PropertyGrid 是否能够编辑动态对象?

Is winform PropertyGrid able to edit dynamic object?

据我们所知,默认情况下 winform PropertyGrid 能够编辑预定义 class 的属性。但是,有时我们可能需要编辑动态创建的对象。参考以下代码:

ParamForm.Show(new { Firstname = "John", Lastname = "Herby" })

ParamForm window 包含 2 个控件,一个 PropertyGrid 和一个 Button。它旨在能够编辑仅包含字符串或布尔字段的动态对象。

public static dynamic Show(dynamic args)
{
    var frm = new ParamForm(args);
    frm.ShowDialog();
    return frm.Result;
}
public ParamForm(dynamic args)
{
    InitializeComponent();
    propertyGrid.SelectedObject = ag;
}

问题是PropertyGrid控件中显示的Firstname & Lastname是灰色的,无法编辑。那么如何让PropertyGrid能够编辑动态创建的对象呢?

匿名类型在设计上只读 属性 描述符(由 属性 网格使用)(有关更多信息,请参见此处:Non-read only alternative to anonymous types)。

然而,您可以使用此处演示的 DynamicTypeDescriptorWrapper class 等技巧:Fun with C# 4.0’s dynamic that implement the ICustomTypeDescriptor Interface