exponenta event banner

Получить сведения о свойствах

Объект 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 способ получения 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]

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).

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'

Связанные темы