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