2011-04-08 1 views
0

Спасибо, что нашли время, чтобы посмотреть на этот вопрос.Как я могу указать атрибут CategoryAttribute для DynamicProperty, созданный динамическими выражениями LINQ?

У меня есть следующий код:

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.

Мой вопрос: «Как установить атрибут CategoryAttribute для каждого DynamicProperty, чтобы они могли быть сгруппированы в PropertyGrid?»

Я намерен иметь третий список, который содержит информацию о категории для каждого элемента в словаре.

После того, как в течение нескольких часов он работал в Интернете, кажется, что он должен делать это только во время компиляции для классов, созданных во время разработки. Однако я подозреваю, что должен быть способ сделать это для динамически создаваемых объектов/свойств.

Любая помощь приветствуется!

ответ