1

如果我有以下课程:

classdef foo
    properties
        bar1
        bar2
        bar3
    end
    properties(Access = private)
        bar4
        bar5
    end
end

并执行以下操作:

myObj = foo();
test = struct(myObj);

test将具有fooas 字段的所有 5 个属性,包括私有属性:

test = 

        bar1: NaN
        bar2: NaN
        bar3: NaN
        bar4: NaN
        bar5: NaN

我希望创建一个只有myObjas 字段的公共属性的结构:

test = 

        bar1: NaN
        bar2: NaN
        bar3: NaN

如何从对象中提取仅包含公共属性的结构?

4

2 回答 2

2

对于更通用的解决方案(即,如果您想查找具有不同集合的属性并获得可见性),您可以使用?运算符或metaclass函数。这将返回一个对象,该对象描述了有关您的类的所有信息。

myDefinition = ?foo
myProperties = myDefinition.PropertyList
isPublic = strcmp({myProperties.SetAccess}, 'public') & strcmp({myProperties.GetAccess}, 'public')
myPublicProperties = myProperties(isPublic)
myPublicPropertyNames = {myPublicProperties.Name}

结果是:

myPublicPropertyNames = 

    'bar1'    'bar2'    'bar3'

现在您知道您的哪些属性是公开的,您可以将此信息转换为您喜欢的任何形式(包括@erikced 的答案所涵盖的结构)。

于 2013-05-30T19:54:48.790 回答
2

您可以使用 获取类的公共属性properties,从那里复制字段不会太难,例如:

myObj = foo();
props = properties(myObj); % or properties('foo') or fieldnames(myObj)
myStruct = cell2struct(cellfun(@(prop) myObj.(prop), props, 'UniformOutput', false), props, 1);

或创建结构并删除私有字段:

myObj = foo();
myStruct = struct(myObj);
myStruct = rmfield(myStruct, setdiff(fieldnames(myStruct), properties(myObj)));
于 2013-05-30T16:49:47.037 回答