如何在运行时向c#类添加属性

时间:2014-06-27 10:34:30

标签: c# propertygrid

我为PropertyGrid控件创建了一个类,它看起来像这样:

public class DetailFilterProperties 
{
    public DetailFilterProperties(TreeViewEventArgs e)
    {
              ...
    }

    [CategoryAttribute("Base"), DescriptionAttribute("Filtered fields referring to a formatted yam field"), ReadOnly(true)]
    public Dictionary<String, String> FilteredFields
    {
        get;
        set;
    }

    ...
}

在运行时我想在我的课程中添加一个字符串属性(或字符串列表),任何人都可以给我一个如何做到这一点的例子。

我浏览了网页并阅读了ExpandoObject,但我打赌有更简单的方法来实现这一点,我还没有找到一个例子。

感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

你不能实际在运行时向C#类添加属性;但是,PropertyGrid通常会通过ICustomTypeDescriptor尊重灵活类型。您可以通过直接实现该接口(大量工作)或通过registring TypeDescriptionProvider(也有很多工作)来提供自定义类型描述符。在任何一种情况下,您都必须实现自定义PropertyDescriptor,并考虑某个地方的数据。

答案 1 :(得分:0)

你可以做的是重新使用我在这个问题的答案中描述的DynamicTypeDescriptor类,在SO:PropertyGrid Browsable not found for entity framework created property, how to find it?

像这样:

  ...
  MyDynamicClass c = new MyDynamicClass();
  c.MyStaticProperty = "hello";

  // build an object "type" from the original one
  DynamicTypeDescriptor dt = new DynamicTypeDescriptor(typeof(MyDynamicClass));

  // get a wrapped instance
  DynamicTypeDescriptor c2 = dt.FromComponent(c);

  // add a property named "MyDynamicProperty" of Int32 type, initial value is 1234
  c2.Properties.Add(new DynamicTypeDescriptor.DynamicProperty(dt, typeof(int), 1234, "MyDynamicProperty", null));

  propertyGrid1.SelectedObject = c2;
  ...

  // the class you want to "modify"
  public class MyDynamicClass
  {
      public string MyStaticProperty { get; set; }
  }