在 MATLAB OOP 中检索添加到 class 的动态属性列表

Retrieve the list of dynamic properties added to class in MATLAB OOP

使用 MATLAB 可以向 class 实例添加动态属性,如下所示:

% Define a class supporting for dynamic properties
classdef DynamicClass < dynamicprops
end

% Add a dynamic property named 'toto' to some instance
c = DynamicClass();
c.addprop('toto');

反正后来没找到通过反射获取动态属性列表的方法,确实:

m = metaclass(c);

returns 一个空的属性列表:

PropertyList: [0x1 meta.property]

甚至在 dynamicprops 中列出属性 superclass returns 一个空列表:

m.SuperClassList(1).PropertyList ==> 0x1 property array

有没有办法获得 (通过反射) 添加到 class 的动态属性列表?

注意:一些解决方法是维护手动列表 newprop(end+1) = c.addprop(...) 但传递到另一个基 class 不太实用(到目前为止我一直在使用反射来获取有关属性的信息child class).

cs = struct(c)

如果只是为了列出和访问属性的名称,这应该足够了

fieldnames( cs)

我找到了一个变通方法来检索元信息,即使是动态属性。我正在使用 properties 获取属性列表 (包括动态属性)findprop 通过在基础 class 中的反射检索信息:

function [] = baseClassRoutine(obj)

    propNames = properties(obj);
    propCount = length(propNames);

    for idx = 1:propCount,

        propName = propNames{ki};
        propMeta = obj.findprop(propName);

        ... So now can inspect meta about all properties (including dynamic ones) ...

    end

end

动态属性 不是 class 的属性,它们只是对象的属性 - 请注意,如果 DynamicClass 继承自 dynamicprops,那么 class DynamicClass 的不同对象可以有一组不同的属性:

>> a = DynamicClass;
>> b = DynamicClass;
>> a.addprop('hello');
>> a
a = 
  DynamicClass with properties:

    hello: []
>> b
b = 
  DynamicClass with no properties.

因此,您将无法通过反射获取有关它们的任何信息,根据定义,反射是获取有关 class.

的信息

您已给出解决方案(使用 properties 检索对象所有属性的名称列表,无论是否动态,然后使用 findprop 获取 属性本身,然后获取有关 属性).

的信息

这在大多数情况下可能会正常工作,但请注意 properties 仅 returns 属性列表 Hidden = falseGetAccess = public(并且即使您在对象的方法内调用 properties 也是如此)。默认情况下,通过 addprop 添加的属性满足这两个条件,但可以在添加后更改它们的属性,并且它们不会出现在您的解决方案中。如果您在对象上调用 fieldnames 也是如此。

另一件可能对您有用的事情是使用 isprop 直接检查对象是否具有 属性 兴趣。即使 属性 是 HiddenGetAccess = private,这仍然有效。有用的是,isprop 适用于对象数组,因此您可以创建 class DynamicClass 的对象数组,然后应用 isprop 获得逻辑数组。

但我知道可靠地获取所有内容(私有与否,隐藏与否,以及您是否事先知道属性名称)的唯一方法是将对象暂时转储到结构中,然后获取正如@Marek 建议的那样,字段名。