Поиск значений по умолчанию в метаданных свойств

Значения по умолчанию

Определения классов могут задавать явные значения по умолчанию для свойств (см. «Значения свойства по умолчанию»). Определите, задает ли класс явное значение по умолчанию для свойства и каково значение по умолчанию от свойства meta.property объект.

данные meta.property

meta.class объект для класса содержит meta.property объект для каждого свойства, заданного классом, включая свойства с частным и защищенным доступом.

Для примера получите meta.class объект для PropertyWithDefault класс, показанный здесь:

classdef PropertyWithDefault
   properties
      Date = date
      RandNumber = randi(9)
   end
end

Получите массив meta.property объекты из meta.class объект:

mc = ?PropertyWithDefault; % meta.class object
mp = mc.PropertyList; % meta.property array

Второй элемент в mp массив является meta.property объект для RandNumber свойство. Перечисление meta.property объект показывает информацию, содержащуюся в его свойствах:

mp(2)
  property with properties:

                   Name: 'RandNumber'
            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: 5
          DefiningClass: [1×1 meta.class]

Два из перечисленных meta.property свойства обеспечивают информацию о значениях по умолчанию:

  • HasDefaulttrue (отображается как 1) если класс задает значение по умолчанию для свойства, false если нет.

  • DefaultValue - Содержит значение по умолчанию, когда класс задает значение по умолчанию для свойства. Если значением по умолчанию является выражение, значение DefaultValue - результат оценки выражения.

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

Эти свойства обеспечивают программный способ получить значения свойства по умолчанию, не открывая файлы определения классов. Используйте эти meta.property свойства объекта для получения значений свойства по умолчанию как для встроенных классов, так и для классов, определенных в MATLAB® код.

Запрос значения по умолчанию

Процедура запроса значения по умолчанию включает в себя:

  1. Получение meta.property объект для свойства, значение по умолчанию которого вы хотите запросить.

  2. Проверка логического значения meta.property HasDefault свойство, чтобы определить, задает ли свойство значение по умолчанию. MATLAB возвращает ошибку при запросе DefaultValue свойство, если класс не задает значение по умолчанию для свойства.

  3. Получение значения по умолчанию из meta.property DefaultValue свойство, если HasDefault значение true.

Используйте ? оператор, metaclass функции, или meta.class.fromName статический метод (работает с char векторная переменная), чтобы получить meta.class объект.

The meta.class PropertyList объекта содержит массив meta.property объекты. Определите, какое свойство соответствует какому meta.property объект с использованием meta.property Name свойство.

Для примера этот класс определяет свойства со значениями по умолчанию:

classdef MyDefs
   properties
      Material = 'acrylic'
      InitialValue = 1.0
   end
end

Выполните следующие шаги, чтобы получить значение по умолчанию, заданное для Material свойство. Включите проверку ошибок, необходимую для вашего приложения.

  1. Получите meta.class объект для класса:

    mc = ?MyDefs;

  2. Получите массив meta.property объекты из meta.class PropertyList свойство:

    mp = mc.PropertyList;
  3. Длина mp массив равен количеству свойств. Можно использовать meta.property Name свойство для поиска интересующего свойства:

    for k = 1:length(mp)
       if (strcmp(mp(k).Name,'Material')
          ...
  4. Перед запросом значения по умолчанию для Material свойство, тестируйте HasDefault meta.property для определения, MyClass ли задает свойство по умолчанию для этого свойства:

    if mp(k).HasDefault
             dv = mp(k).DefaultValue;
          end

The DefaultValue свойство доступно только для чтения. Изменение значения по умолчанию в определении класса изменяет значение DefaultValue свойство. Вы можете запросить значение по умолчанию свойства независимо от его параметров доступа.

Абстрактные и динамические свойства не могут задать значения по умолчанию. Поэтому MATLAB возвращает ошибку, если вы пытаетесь запросить значение по умолчанию свойств с этими атрибутами. Всегда проверяйте логическое значение meta.property HasDefault свойство перед запросом DefaultValue свойство, чтобы избежать генерации ошибки.

Значения по умолчанию, определенные как выражения

Определения классов могут определять значения свойства по умолчанию как выражения MATLAB (для получения дополнительной информации см. «Оценка выражений в определениях классов»). MATLAB оценивает эти выражения при первой необходимости использования значения по умолчанию, например при первом создании образца класса.

Запрос meta.property DefaultValue свойство заставляет MATLAB вычислить выражение значения по умолчанию, если оно еще не было оценено. Поэтому запрос значения свойства по умолчанию может вернуть ошибку или предупреждение, если при оценке выражения MATLAB происходят ошибки или предупреждения. Смотрите Свойство с выражением, которое Ошибки для примера.

Свойство без явного значения по умолчанию

MyClass не задает явно значение по умолчанию для Foo свойство:

classdef MyFoo
   properties
      Foo
   end
end

The meta.property образец для Foo свойств имеет значение false для HasDefault. Поскольку класс явным образом не задает значение по умолчанию для Foo, попытка получить доступ к DefaultValue свойство вызывает ошибку:

mc = ?MyFoo;
mp = mc.PropertyList(1);
mp.HasDefault
ans =

    0
dv = mp.DefaultValue;
No default value has been defined for property Foo

Абстрактное свойство

MyClass задает Foo свойство как Abstract:

classdef MyAbst
   properties (Abstract)
      Foo
   end
end

The meta.property образец для Foo свойств имеет значение false для его HasDefault свойство, поскольку вы не можете задать значение по умолчанию для Abstract свойство. Попытка получить доступ к DefaultValue вызывает ошибку:

mc = ?MyAbst;
mp = mc.PropertyList(1);
mp.HasDefault
ans =

    0
dv = mp.DefaultValue;
Property Foo is abstract and therefore cannot have a default value.

Свойство с выражением, которое ошибается

MyPropEr задает Foo значение свойства по умолчанию как выражение, которое ошибается при оценке.

classdef MyPropEr
   properties
      Foo = sin(pie/2)
   end
end

The meta.property объект для Foo свойств имеет значение true для его HasDefault свойство из-за Foo имеет значение по умолчанию:

sin(pie/2)

Однако это выражение возвращает ошибку (pie является функцией, которая создает круговый граф, а не значение pi).

mc = ?MyPropEr;
mp = mc.PropertyList(1);
mp.HasDefault
ans =

    1
dv = mp.DefaultValue;
Error using pie (line 29)
Not enough input arguments.

Запрос значения по умолчанию вызывает оценку выражения и возвращает ошибку.

Свойство с явным определением значения по умолчанию пустого

MyEmptyProp присваивает значение по умолчанию [] (пустой двойной) в Foo свойство:

classdef MyEmptyProp
   properties
      Foo = []
   end
end

The meta.property объект для Foo свойств имеет значение true для своего HasDefault свойство. Доступ к DefaultValue возвращает значение []:

mc = ?MyEmptyProp;
mp = mc.PropertyList(1);
mp.HasDefault
ans =

    1
dv = mp.DefaultValue;
dv =

    []

Похожие темы