Я не смог найти твердое объяснение разности GetProperties()
и GetProperties(Attribute[])
Основное отличие состоит в том, что GetProperties()
возвращает все свойства, определенные на типа, реализующего ICustomTypeDescriptor
в то время как GetProperites(Attributes [] attributes)
возвращает список свойств, которые присваиваются хотя бы одним из атрибутов в параметре Attribute[] attributes
.
Проверьте этот пример реализации, который использует GetProperties()
, чтобы получить список свойств, а затем отфильтровывает его против массива Атрибуты [].
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());
}
}
Какие атрибуты используются для второго способа и каким образом дескриптор решил вызывает ли он GetProperties с или без массива атрибутов.
Используемые атрибуты выбираются кодом клиента, который использует TypeDesciptor
для получения списка свойств.
Например, элемент управления PropertyGrid, который используется в visual studio, использует этот механизм для группировки свойств выбранного объекта в категории, когда вы выбираете TextBox, например, на холсте дизайна, тогда свойства для этого TextBox отображаются в PropertyGrid и подразделяются на макете, шрифт, Разное, и т.д ...
Это достигается за счет аннотирования эти свойства в классе TextBox с атрибутом Category
и затем TypeDescriptor
вызовы GetProperties(Attributes [] attributes)
на классе TextBox Pasing Category
в массиве и возвращает все TextBox свойства, которые имеют атрибут Category
.
Вы прочитали описание того, как работает фильтр свойств? http://msdn.microsoft.com/en-US/library/3yx7k228.aspx – Will