如何在使用LINQ动态表达式创建的DynamicProperty上指定CategoryAttribute?

时间:2011-04-08 05:46:28

标签: c# linq propertygrid

感谢您抽出宝贵时间来研究这个问题。

我有以下代码:

    public partial class TemplateEditor : Form {
    private object dynamicObject;
    private Type dynamicType;
    private Dictionary<string, string> properties;
    public TemplateEditor() {
        InitializeComponent();
        properties = new Dictionary<string, string> {{ "Name 1", "Value 1" },
                                                     { "Name 2", "2nd Thing" },
                                                     { "Name 3", "Third" }};
        var dynamicProperties = new List<DynamicProperty>();

        foreach (KeyValuePair<string, string> pair in properties) {
            dynamicProperties.Add(new DynamicProperty(pair.Key, typeof(string)));
        }
        dynamicType = DynamicExpression.CreateClass(dynamicProperties);
        dynamicObject = Activator.CreateInstance(dynamicType);
        propertyGrid.SelectedObject = dynamicObject;

        foreach (KeyValuePair<string, string> pair in properties) {
            dynamicType.GetProperty(pair.Key).SetValue(propertyGrid.SelectedObject, pair.Value, null);
        }
    }
    private void CopyDynamicObjectValuesToDictionary() {
        var updatedTemplateProperties = new Dictionary<string, string>();

        foreach (KeyValuePair<string, string> pair in properties) {
            string value = (string)dynamicType.GetProperty(pair.Key).GetValue(propertyGrid.SelectedObject, null);
            updatedTemplateProperties.Add(pair.Key, value);
        }
        properties = updatedTemplateProperties;
        // Display Updated Dictionary
        foreach (KeyValuePair<string, string> pair in properties) {
            textBox1.AppendText(pair.Key);
            textBox1.AppendText(": \"");
            textBox1.AppendText(pair.Value);
            textBox1.AppendText("\" of type ");
            textBox1.AppendText(typeof(string).ToString());
            textBox1.AppendText(Environment.NewLine);
        }
        textBox1.AppendText(Environment.NewLine);
    }
    private void OnShowValuesButtonClick (object sender, EventArgs e) {
        CopyDynamicObjectValuesToDictionary();
    }
}

我用它来在PropertyGrid中显示可编辑的字典。它基于这篇文章:http://consultingblogs.emc.com/howardvanrooijen/archive/2009/03/02/reduce-propertygrid-development-pain-by-using-linq-dynamic-expressions.aspx

我喜欢这种技术,因为这是将动态数据导入PropertyGrid的一种非常简单的方法。

我的问题是:“如何为每个DynamicProperty设置CategoryAttribute,以便它们可以在PropertyGrid中进行分组?”

我打算有第三个列表,其中包含词典中每个项目的类别信息。

谷歌搜索几个小时后,似乎只有在设计时创建的类的编译时才会这样做。但是我怀疑必须有一种方法可以为动态创建的对象/属性执行此操作。

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

看起来这可能就像我来弄清楚它一样。回答我自己的问题以供参考。

http://www.codeproject.com/Messages/1016749/Re-nice.aspx