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

Объект 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]

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

mc.PropertyList(1).Name
ans =

Date

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

Для класса handle используйте handle findprop метод получения 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 отображение показывает, что значение по умолчанию BasicHandle Category объекта свойство:

  • Имеет общедоступную 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]

The 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

Поиск свойств с определенными атрибутами

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

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

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

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

The 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'

Похожие темы