0

我有一些类,我为其创建了几个常量属性。这是一些示例代码:

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

在主代码中,我通过分配类句柄来创建对象,在这种情况下,类句柄来自一个单独的函数传递的预分配值。这就像

fuctionModel = @genericClassName;

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

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

genericClassName.Name
genericClassName.Description

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

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

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

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

将名称为Description的常量放入变量result中。这可用于我需要的东西,我可能只是将它包装成一个函数。

4

3 回答 3

3

嗯,如果您只有构造函数方法的句柄,并且希望避免构造实例(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
于 2021-03-16T08:41:38.603 回答
2

没有类句柄之类的东西。我认为 MATLAB 中没有其他方法可以通过名称(直接在代码中或作为字符串)来引用类。你的代码

fuctionModel = @genericClassName;

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

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

a = fuctionModel();
a.Name

Edric提出了一个替代方案,但也不方便或漂亮。

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

fuctionModel = 'genericClassName';
eval([fuctionModel,'.Name']);
于 2021-03-16T06:12:01.067 回答
0

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

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

将名称为 Description 的常量放入变量结果中。这在包装在函数中时效果很好。

于 2021-03-17T00:48:45.837 回答