【问题标题】:MATLAB: discover restricted class of propertiesMATLAB:发现受限制的属性类
【发布时间】:2017-03-09 14:05:26
【问题描述】:

MATLAB R2016a 引入了一种记录机制来限制对象属性的类(我知道还有一种较旧的、不同的、未记录的方法可以做到这一点,但我没有使用那种方法)。例如:

classdef MyClass
    properties
        myProperty RestrictedClass
    end
end

将限制属性myProperty,使其值必须属于RestrictedClass类。

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

我希望如果我使用了

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

然后元属性对象p 将包含有关它被限制的类的信息 - 但似乎不是。

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

PS 也不涉及像解析类的源代码这样的粗俗。想象一下,我可能想对一个源代码已使用pcode 混淆的类执行此操作。

【问题讨论】:

    标签: matlab oop


    【解决方案1】:

    您可以使用未记录的将对象转换为结构的技巧来检查对象的非公共属性。 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'}
    

    【讨论】:

    • 感谢@excaza,很抱歉离开这个答案这么久而不接受。仅供参考,事实证明(至少在 17a+ 中)您不需要转换为结构。如果p 是属性对象,您可以使用p.Validation 来获取相同的信息。 Validation 属性仍处于隐藏状态,但无需转换为结构体。
    • @SamRoberts 谢谢,我认为这可能是我遇到类似问题的一些懒惰的复制+粘贴。
    猜你喜欢
    • 1970-01-01
    • 2014-11-24
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 2020-06-26
    • 2012-05-10
    相关资源
    最近更新 更多