访问 Matlab 类属性(又名常量)



我有一些类,我为它们创建了几个常量属性。下面是一些示例代码:

classdef genericClassName < handle
properties (Constant)
Name = 'genericClassName'
Description = 'description of the class'
end
...

在主代码中,我通过分配类句柄来创建对象,在本例中,类句柄来自从单独函数传递的预分配值。就像

fuctionModel = @genericClassName;

稍后我将创建其他对象并将functionModel的值传递给这些类。到目前为止,一切正常。

Matlab 文档说这些常量属性的访问方式如下:

genericClassName.Name
genericClassName.Description

我可以在命令行中键入它,它会产生所需的结果,给出NameDescription属性的值 - 分配给常量属性的相同值。但是,我只有句柄,它作为@genericClassName保存在函数模型中

这是我的问题:当我只有句柄并在其符号前面时,我如何引用这个类及其常量属性?

更新没有更简单或简洁的答案,@Edric和@CrisLuengo的答案的组合似乎有效。例如:

mc=meta.class.fromName(func2str(functionalModel));
result = eval([mc.Name '.Description']);

将名称为Description的常量放入变量结果中。这对于我需要的东西很有用,我可能只是将其包装到一个函数中。

嗯,如果你只有构造函数方法的句柄,并且你希望避免构造一个实例(MATLAB 允许你从实例访问Constant属性),那么这里有一种方法可以使用meta.class.fromName.

fh = @genericClassName;
% Get the metaclass from the constructor
mc = meta.class.fromName(func2str(fh));
% Find the property named 'Name'
idx = strmatch('Name', {mc.PropertyList.Name})
% Get the default (Constant) value
mc.PropertyList(idx).DefaultValue

没有类句柄这样的东西。我认为 MATLAB 中没有办法通过它的名称(直接在代码中或作为字符串)引用一个类。您的代码

fuctionModel = @genericClassName;

在变量fuctionModel中存储构造函数genericClassName的句柄。使用此句柄,可以构造类的对象,但不能执行任何其他操作。这不是对类本身的引用。

目前还不清楚你为什么以这种方式设置代码。但是,通过此句柄访问常量的最简单方法是首先创建类的对象:

a = fuctionModel();
a.Name

埃德里克提出了一个替代方案,也不方便也不漂亮。

第三种选择,我不提倡(这可能会导致代码变慢,并且难以阅读和维护)是将类的名称存储为字符串,然后使用eval来获取值:

fuctionModel = 'genericClassName';
eval([fuctionModel,'.Name']);

如果没有更简单或简洁的答案,@Edric和@CrisLuengo的答案的组合似乎有效。例如:

mc=meta.class.fromName(func2str(functionalModel));
result = eval([mc.Name '.Description']);

将名称为 Description 的常量放入变量结果中。当包装在函数中时,这足够好用。

最新更新