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

Объект 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 используйте 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

Как к 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'

Похожие темы