2

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

% 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);

返回属性的空列表:

PropertyList: [0x1 meta.property]

即使在dynamicprops超类中列出属性也会返回一个空列表:

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

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

注意:一些解决方法是维护手动列表newprop(end+1) = c.addprop(...),但传递给另一个基类并不是很实用(直到现在我一直在使用反射来获取有关子类中属性的信息)。

4

3 回答 3

1

我找到了一种解决方法来检索动态属性的元信息。我properties用于获取属性列表(包括动态属性)findprop通过基类中的反射检索信息:

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
于 2015-04-17T09:27:32.683 回答
1
cs = struct(c)

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

fieldnames( cs)
于 2015-04-17T08:54:03.017 回答
1

动态属性不是类的属性,它们只是对象的属性 - 请注意,如果DynamicClass继承自dynamicprops,则类的不同对象DynamicClass可以具有不同的属性集:

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

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

出于这个原因,您将无法通过反射获得有关它们的任何信息,根据定义,反射是获取有关类的信息。

您已经给出了一个解决方案(用于properties检索对象的所有属性的名称列表,无论是否动态,然后用于findprop获取属性本身,然后获取有关该属性的信息)。

在大多数情况下,这可能工作正常,但请注意,它只返回一个同时为andproperties的属性列表(即使您在对象的方法内部调用也是如此)。默认情况下,通过添加的属性满足这两个条件,但可以在添加它们后更改它们的属性,并且它们不会显示在您的解决方案中。如果你调用对象也是如此。Hidden = falseGetAccess = publicpropertiesaddpropfieldnames

可能对您有用的另一件事是用于isprop直接检查对象是否具有感兴趣的属性。即使该属性是Hidden, 或 ,这也有效GetAccess = private。有用的是,isprop适用于对象数组,因此您可以创建一个类对象数组DynamicClass,然后申请isprop获取一个逻辑数组。

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

于 2015-04-17T14:06:48.393 回答