我为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
,但我打赌有更简单的方法来实现这一点,我还没有找到一个例子。
感谢你的帮助。
答案 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; }
}