2013-07-25 2 views
0

Читая статью MSDN для ICustomTypeDescriptor http://msdn.microsoft.com/de-de/library/system.componentmodel.icustomtypedescriptor.aspx Я не смог найти твердое объяснение разницы GetProperties() и GetProperties(Attribute[])ICustomTypeDescriptor: Когда вызывается GetProperties (Атрибут [])?

Какие атрибуты используются для второго метода и как дескриптор решил вызывает ли GetProperties с или без массива Attribute.

(я портирован код и таблицу свойств в старом коде, используемом для вызова GetProperties(Attributes[]) однако новый код делает только вызвать GetProperties без атрибутов, и я не вижу, что влияет на это)

+1

Вы прочитали описание того, как работает фильтр свойств? http://msdn.microsoft.com/en-US/library/3yx7k228.aspx – Will

ответ

2

Я не смог найти твердое объяснение разности 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.

Смежные вопросы