在 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 = false
和 GetAccess = public
(并且即使您在对象的方法内调用 properties
也是如此)。默认情况下,通过 addprop
添加的属性满足这两个条件,但可以在添加后更改它们的属性,并且它们不会出现在您的解决方案中。如果您在对象上调用 fieldnames
也是如此。
另一件可能对您有用的事情是使用 isprop
直接检查对象是否具有 属性 兴趣。即使 属性 是 Hidden
或 GetAccess = private
,这仍然有效。有用的是,isprop
适用于对象数组,因此您可以创建 class DynamicClass
的对象数组,然后应用 isprop
获得逻辑数组。
但我知道可靠地获取所有内容(私有与否,隐藏与否,以及您是否事先知道属性名称)的唯一方法是将对象暂时转储到结构中,然后获取正如@Marek 建议的那样,字段名。
使用 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 = false
和 GetAccess = public
(并且即使您在对象的方法内调用 properties
也是如此)。默认情况下,通过 addprop
添加的属性满足这两个条件,但可以在添加后更改它们的属性,并且它们不会出现在您的解决方案中。如果您在对象上调用 fieldnames
也是如此。
另一件可能对您有用的事情是使用 isprop
直接检查对象是否具有 属性 兴趣。即使 属性 是 Hidden
或 GetAccess = private
,这仍然有效。有用的是,isprop
适用于对象数组,因此您可以创建 class DynamicClass
的对象数组,然后应用 isprop
获得逻辑数组。
但我知道可靠地获取所有内容(私有与否,隐藏与否,以及您是否事先知道属性名称)的唯一方法是将对象暂时转储到结构中,然后获取正如@Marek 建议的那样,字段名。