Получение информации о свойствах

Объект meta.property

Используйте класс meta.property, чтобы определить значения атрибутов свойства. Перезаписываемые свойства объекта meta.property соответствуют атрибутам связанного свойства. Значения перезаписываемых свойств meta.property соответствуют значениям атрибута, заданным в определении класса.

Получите объект meta.property для свойства от объекта meta.class. Получить объект meta.class для класса:

  • Используйте функцию metaclass на объекте класса.

  • Используйте оператор ? с именем класса.

Например, класс BasicHandle задает три свойства:

classdef BasicHandle < handle
   properties (SetAccess = private)
      Date = date
      PassKey = randi(9,[1,7])
   end
   properties
      Category {mustBeMember(Category,{'new','change'})} = 'new'
   end
end

Создайте объект meta.class с помощью оператора ? с именем класса:

mc = ?BasicHandle
mc = 

  class with properties:

                     Name: 'BasicHandle'
              Description: ''
      DetailedDescription: ''
                   Hidden: 0
                   Sealed: 0
                 Abstract: 0
              Enumeration: 0
          ConstructOnLoad: 0
         HandleCompatible: 1
          InferiorClasses: {0×1 cell}
        ContainingPackage: [0×0 meta.package]
     RestrictsSubclassing: 0
             PropertyList: [3×1 meta.property]
               MethodList: [22×1 meta.method]
                EventList: [1×1 meta.event]
    EnumerationMemberList: [0×1 meta.EnumeratedValue]
           SuperclassList: [1×1 meta.class]

Свойство объекта meta.class под названием PropertyList содержит массив объектов meta.property, один для каждого свойства, заданного классом. Например, имя свойства, сопоставленного с объектом meta.property в элементе 1:

mc.PropertyList(1).Name
ans =

Date

Объект meta.class содержит объект meta.property для всех свойств, включая скрытые свойства. Функция properties возвращает только общественные собственности.

Для класса Handle используйте метод findprop handle, чтобы получить объект meta.property для определенного свойства.

Например, найдите объект meta.property для свойства Category класса BasicHandle.

mp = findprop(BasicHandle,'Category')
mp = 

  property with properties:

                   Name: 'Category'
            Description: ''
    DetailedDescription: ''
              GetAccess: 'public'
              SetAccess: 'public'
              Dependent: 0
               Constant: 0
               Abstract: 0
              Transient: 0
                 Hidden: 0
          GetObservable: 0
          SetObservable: 0
               AbortSet: 0
            NonCopyable: 0
              GetMethod: []
              SetMethod: []
             HasDefault: 1
           DefaultValue: 'new'
          DefiningClass: [1×1 meta.class]

Предыдущее отображение meta.property показывает что свойство Category объекта BasicHandle по умолчанию:

  • Имеет общедоступный GetAccess и SetAccess

  • Имеет значение по умолчанию new

Для списка атрибутов свойства см. Таблицу Атрибутов свойств.

Как индексировать объекты метакласса

Доступ к другому метаклассу возражает непосредственно от свойств объектов meta.class. Например, оператор:

mc = ?containers.Map;

возвращает объект meta.class:

class(mc)
ans =

meta.class

Ссылка на свойство PropertyList meta.class возвращает массив с одним объектом meta.property для каждого свойства класса containers.Map:

class(mc.PropertyList)
ans =

meta.property

Каждый элемент массива является единственным объектом meta.property:

mc.Properties(1)
ans = 

    [1x1 meta.property]

Свойство Name объекта meta.property содержит вектор char, который является именем свойства:

class(mc.PropertyList(1).Name)
ans =

char

Примените стандартную индексацию MATLAB®, чтобы получить доступ к информации в объектах метакласса.

Например, свойство meta.class PropertyList содержит массив объектов meta.property. Следующее выражение получает доступ к первому объекту meta.property в этом массиве и возвращает первое и последнее (C и t) буквы от вектора char, содержавшегося в свойстве meta.property Name.

mc.PropertyList(1).Name([1 end])
ans =

Ct

Как к Find Properties с определенными атрибутами

Этот пример реализует функцию, которая находит свойства с определенными значениями атрибута. Например, вы можете:

  • Найдите объекты, которые задают постоянные свойства (набор атрибута Constant к true).

  • Определите, какие свойства только для чтения (GetAccess = public, SetAccess = private).

Функция findAttrValue возвращает массив ячеек имен свойства, которые устанавливают заданный атрибут.

Информация о доступах к функции findAttrValue от метаданных с помощью этих методов:

  • Если входной параметр, obj, является вектором char, используйте статический метод meta.class.fromName получить объект meta.class.

  • Если входной параметр, obj, является объектом, используйте функцию metaclass, чтобы получить объект meta.class.

  • Каждое свойство имеет связанный объект meta.property. Получите эти объекты из свойства meta.class PropertyList.

  • Используйте класс handle метод findprop, чтобы определить, является ли требуемый атрибут свойства допустимым названием атрибута. Все атрибуты свойства являются свойствами объекта meta.property. Оператор, findobj(mp,'PropertyName') определяет, имеет ли объект meta.property, mp, свойство под названием PropertyName.

  • Ссылочные свойства объектов meta.property с помощью динамических имен полей. Например, если attrName = 'Constant', то MATLAB преобразовывает выражение mp.(attrName) в mp.Constant

  • Дополнительный третий аргумент позволяет вам задать значение атрибутов, значениями которых не является логический true или false (такой как GetAccess и SetAccess).

function cl_out = findAttrValue(obj,attrName,varargin)
   if ischar(obj)
      mc = meta.class.fromName(obj);
   elseif isobject(obj)
      mc = metaclass(obj);
   end
   ii = 0; numb_props = length(mc.PropertyList);
   cl_array = cell(1,numb_props);
   for  c = 1:numb_props
      mp = mc.PropertyList(c);
      if isempty (findprop(mp,attrName))
         error('Not a valid attribute name')
      end
      attrValue = mp.(attrName);
      if attrValue
         if islogical(attrValue) || strcmp(varargin{1},attrValue)
            ii = ii + 1;
            cl_array(ii) = {mp.Name};
         end
      end
   end
   cl_out = cl_array(1:ii);
end

Нахождение Атрибутов свойств

Предположим, что у вас есть следующий объект containers.Map:

mapobj = containers.Map({'rose','bicycle'},{'flower','machine'});

Найдите свойства с private SetAccess:

findAttrValue(mapobj,'SetAccess','private')
ans = 

    'Count'    'KeyType'    'ValueType'    'serialization'

Найдите свойства с public GetAccess:

findAttrValue(mapobj,'GetAccess','public')
ans = 

    'Count'    'KeyType'    'ValueType'

Похожие темы

Была ли эта тема полезной?