使用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(...)
但是传递给另一个基类不是很实际(直到现在我一直在使用反射来获取有关子类属性的信息)。
动态属性不是类的属性,它们只是对象的属性-请注意,如果DynamicClass
继承自dynamicprops
,则类的不同对象DynamicClass
可以具有不同的属性集:
>> a = DynamicClass;
>> b = DynamicClass;
>> a.addprop('hello');
>> a
a =
DynamicClass with properties:
hello: []
>> b
b =
DynamicClass with no properties.
因此,您将无法通过反射获取有关它们的任何信息,即通过定义获取有关该类的信息。
您提供了一种解决方案(用于properties
检索对象的所有属性名称(动态或非动态名称),然后用于findprop
获取属性本身,然后获取有关该属性的信息)。
在大多数情况下,这很可能行得通,但是请注意,properties
仅返回一个同时为Hidden = false
和的属性列表GetAccess = public
(即使properties
在对象的方法内部调用也是如此)。默认情况下,通过添加的属性addprop
同时满足这两个条件,但是可以在添加属性后更改其属性,并且这些属性不会在您的解决方案中显示。如果调用fieldnames
该对象,也会发生同样的情况。
可能对您有用的另一件事是用于isprop
直接检查对象是否具有感兴趣的属性。即使该属性为Hidden
或,此方法也有效GetAccess = private
。有用的是,isprop
可以处理对象数组,因此您可以创建class的对象数组DynamicClass
,然后应用isprop
以获得逻辑数组。
但是,我知道可靠地获取所有内容(私有与否,隐藏与否以及是否事先知道属性名称)的唯一方法是将对象临时转储到结构中,然后获取字段名称,如@ Marek建议。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句