MATLAB R2016a引入了一种用于限制对象属性类的文档化机制(我知道还有一种较旧的,不同的,未记录的方法,但我没有使用该方法)。例如:
classdef MyClass
properties
myProperty RestrictedClass
end
end
会限制属性myProperty
,使其值必须为RestrictedClass
类。
如果您已经实现了这样的类,有没有办法使用MATLAB的类元数据接口以编程方式发现受限制的属性类?
我希望如果我使用
m = ?MyClass;
p = m.PropertyList(1);
然后metaproperty对象p
将包含有关它被限制的类的信息 - 但似乎没有。
有没有办法以编程方式发现它?该方法不需要涉及实际实例化类 - 因为它可能有副作用,也因为它需要使用抽象类。
PS也没有涉及解析类的源代码的任何重要内容。想象一下,我可能想要使用pcode
对其源代码进行模糊处理的类来执行此操作。
答案 0 :(得分:2)
您可以使用未记录的将对象转换为结构的hack来检查对象的非公共属性。 meta.Property
对象包含隐藏的meta.Validation
对象属性,该属性具有属性的验证信息:
Validation with properties:
Class: [1×1 meta.class]
Size: [1×0 meta.ArrayDimension]
ValidatorFunctions: {1×0 cell}
使用给定的示例类:
classdef SOcode
properties
myProperty1 double
myProperty2 struct
end
end
我们可以检查meta.PropertyList
以找到我们需要的值:
>> test = struct(codemeta.PropertyList(1))
test =
struct with fields:
Name: 'myProperty1'
... snip ...
Type: [1×1 meta.type]
Validation: [1×1 meta.Validation]
DefiningClass: [1×1 meta.class]
... snip ...
然后我们可以执行以下操作:
codemeta = ?SOcode;
nprops = numel(codemeta.PropertyList);
validationclass = cell(nprops, 1);
for ii = 1:nprops
validationclass{ii} = codemeta.PropertyList(ii).Validation.Class.Name;
end
并收到:
>> validationclass
validationclass =
2×1 cell array
{'double'}
{'struct'}