Используйте 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'