ICustomTypeDescriptor:何时调用GetProperties(Attribute [])?

时间:2013-07-25 14:05:35

标签: c#

阅读ICUSTomTypeDescriptor http://msdn.microsoft.com/de-de/library/system.componentmodel.icustomtypedescriptor.aspx的MSDN文章 我无法找到一个可靠的解释 GetProperties()GetProperties(Attribute[])

第二种方法使用了哪些属性,以及描述符如何决定是否使用GetProperties数组调用Attribute

(我已经在用于调用GetProperties(Attributes[])的旧代码中移植了一些代码和属性网格但是新代码只调用没有属性的GetProperties而我看不出有什么影响这个)

1 个答案:

答案 0 :(得分:2)

  

我无法找到一个可靠的解释   GetProperties()GetProperties(Attribute[])

主要区别在于GetProperties()返回在实现ICustomTypeDescriptor的类型上定义的所有属性,而GetProperites(Attributes [] attributes)返回属性列表,这些属性至少归因于{中的一个属性{1}}参数。

检查此示例实现,该实现使用Attribute[] attributes获取属性列表,然后针对Attributes []数组过滤它。

GetProperties()
  

第二种方法使用了哪些属性以及如何使用   描述符决定了它是否调用GetProperties   属性数组。

使用的属性由客户端代码选择,客户端代码使用TypeDesciptor来获取属性列表。

例如,visual studio中使用的PropertyGrid控件使用此机制将所选对象的属性分组为类别,当您在设计画布上选择TextBox时,该TextBox的属性将显示在PropertyGrid中并进行分类进入布局,字体,杂项等...

这是通过使用Category属性在TextBox类中注释这些属性,然后在数组中的public override PropertyDescriptorCollection GetProperties(Attribute[] attributes) { List<PropertyDescriptor> descriptors = new List<PropertyDescriptor>(); foreach (PropertyDescriptor descriptor in this.GetProperties()) { bool include = false; foreach (Attribute searchAttribute in attributes) { if (descriptor.Attributes.Contains(searchAttribute)) { include = true; break; } } if (include) { descriptors.Add(descriptor); } } return new PropertyDescriptorCollection(descriptors.ToArray()); } } 的TextBox类上调用TypeDescriptor调用GetProperties(Attributes [] attributes)来实现的。 TextBox返回所有具有Category属性的属性。