【问题标题】:Retrieve the list of dynamic properties added to class in MATLAB OOP检索添加到 MATLAB OOP 中的类的动态属性列表
【发布时间】:2015-06-23 23:05:53
【问题描述】:

使用 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(...),但传递给另一个基类并不是很实际(直到现在我一直在使用反射来获取有关子类中属性的信息)。

【问题讨论】:

    标签: matlab oop metaclass dynamic-properties


    【解决方案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 获取属性本身,然后获取有关该属性的信息) .

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

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

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

    【讨论】:

    • 确实有趣的附加说明。谢谢!
    【解决方案2】:

    我找到了一种解决方法,可以检索动态属性的元信息。我使用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
    

    【讨论】:

    • 这是一个不错的解决方案。想到另一个:您可以覆盖 subsref 和 subsasgn 来模拟动态属性,而不是使用内置的 dynamicprops。
    【解决方案3】:
    cs = struct(c)
    

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

    fieldnames( cs)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-23
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多