MATLAB:发现受限制的属性类

时间:2017-03-09 14:05:27

标签: matlab oop

MATLAB R2016a引入了一种用于限制对象属性类的文档化机制(我知道还有一种较旧的,不同的,未记录的方法,但我没有使用该方法)。例如:

classdef MyClass
    properties
        myProperty RestrictedClass
    end
end

会限制属性myProperty,使其值必须为RestrictedClass类。

如果您已经实现了这样的类,有没有办法使用MATLAB的类元数据接口以编程方式发现受限制的属性类?

我希望如果我使用

m = ?MyClass;
p = m.PropertyList(1);

然后metaproperty对象p将包含有关它被限制的类的信息 - 但似乎没有。

有没有办法以编程方式发现它?该方法不需要涉及实际实例化类 - 因为它可能有副作用,也因为它需要使用抽象类。

PS也没有涉及解析类的源代码的任何重要内容。想象一下,我可能想要使用pcode对其源代码进行模糊处理的类来执行此操作。

1 个答案:

答案 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'}