动态的创建属性及编辑的问题

mero 2009-02-03 10:16:33
我现在需要动态的创建类型,并动态的为类型创建、删除属性,并可以改变属性的类型。而且改动后都可以在PropertyGrid中有体现,并可以在PropertyGrid中直接编辑数值。动态创建类型没有问题,通过TypeBuilder来进行,但如何动态的添加、删除属性并能够在PropertyGrid中进行编辑呢?
...全文
223 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mero 2009-02-06
  • 打赏
  • 举报
回复
顶~
mero 2009-02-05
  • 打赏
  • 举报
回复
有没有高手懂的啊?版主哪去了
fskang 2009-02-05
  • 打赏
  • 举报
回复
不明白你这样做的意义何在。C#是个静态类型语言,就算你实现了可以自由添加删除属性的类,你在代码里怎么用它呢?
mero 2009-02-05
  • 打赏
  • 举报
回复
就是创建一个类,类里面的属性我都可以任意的增加、删除;同时这些属性我可以让PropertyGrid显示正确,并编辑正确。
我现在遇到的问题是PropertyGrid无法正确显示这个类里面的属性。代码如下:
public class Entity : ICustomTypeDescriptor
{
PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)
{
foreach (KeyValuePair<String, Component> component in ComponentList)
{
ArrayList al = new ArrayList();

//设置Category属性
al.Add(new CategoryAttribute(component.Key));

//设置描述属性
al.Add(new DescriptionAttribute(component.Key));


foreach( KeyValuePair<String, Component.Property> property in component.Value.PropertyList )
{
PropertyStub psd = new PropertyStub(component.Value, property.Key, (Attribute[])al.ToArray(typeof(Attribute)));
props.Add(psd);
}

}

PropertyDescriptor[] propArray = (PropertyDescriptor[])props.ToArray(typeof(PropertyDescriptor));
return new PropertyDescriptorCollection(propArray);
}
}

private class PropertyStub : PropertyDescriptor
{
Object m_Object;
String m_PropertyName;

public PropertyStub(Component component, String PropertyName, Attribute[] attrs)
: base(PropertyName, attrs)
{
m_Object = component.GetProperty(PropertyName);
m_PropertyName = PropertyName;
}

public override Type ComponentType
{
get { return m_Object.GetType(); }
}

public override bool IsReadOnly
{
get { return false; }
}


public override Type PropertyType
{
get { return m_Object.GetType(); }
}

public override bool CanResetValue(object component)
{
return false;
}

public override object GetValue(object component)
{
return m_Object;
}

public override void ResetValue(object component)
{
}

public override void SetValue(object component, object value)
{
m_Object = value;
}

public override bool ShouldSerializeValue(object component)
{
return false;
}
}

显示出来的属性好像都是通过ToString()方法得到的,无法正确显示属性里面的东西。
fskang 2009-02-05
  • 打赏
  • 举报
回复
不太明白你的意思,不过看情况你说的似乎类似AOP里的mixin。
fskang 2009-02-05
  • 打赏
  • 举报
回复
不太明白你的意思,不过看情况你说的似乎类似AOP里的mixin。
mero 2009-02-05
  • 打赏
  • 举报
回复
顶啊~
shalen520 2009-02-03
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/en-us/magazine/cc163816.aspx

实现一个ICustomTypeDescriptor即可,这个是标准解决方案
mero 2009-02-03
  • 打赏
  • 举报
回复
顶起来~
mero 2009-02-03
  • 打赏
  • 举报
回复
顶起来~
mero 2009-02-03
  • 打赏
  • 举报
回复
其实就是希望做这样一个功能:
现在都是组件的开发模式,那么组件应该可以由一系列的属性进行自由的拼装.这样组件就需用能够动态的创建,属性也可以又一些基本的类型组成或者自己编写的类动态的编译形成属性。

为了实现上面的功能需要2个关键东西:一个是动态的创建,这个应该都会;另一个是能够很方便的编辑属性的值,那么就依赖PropertyGrid。
现在就是不知道如何能够让PropertyGrid识别出动态创建出来的组件的属性,请大侠们指点啊。
ZJ159 2009-02-03
  • 打赏
  • 举报
回复
顶顶啊
mero 2009-02-03
  • 打赏
  • 举报
回复
大侠说得太言简意赅了,写个代码例子看看呀
shalen520 2009-02-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mero 的回复:]
例子里面的Person2是在代码里面写死从FieldsToPropertiesTypeDescriptor继承的,那如果Person2也要动态的生成,如何做?
[/Quote]

emit
mero 2009-02-03
  • 打赏
  • 举报
回复
例子里面的Person2是在代码里面写死从FieldsToPropertiesTypeDescriptor继承的,那如果Person2也要动态的生成,如何做?

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧