2

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(...)が、別の基本クラスに渡すことはあまり実用的ではありません (ここまでは、子クラスのプロパティに関する情報を取得するためにリフレクションを使用していました)。

4

3 に答える 3

1
cs = struct(c)

プロパティの名前を一覧表示してアクセスするだけの場合は、これで十分です。

fieldnames( cs)
于 2015-04-17T08:54:03.017 に答える
1

動的プロパティでもメタ情報を取得する回避策を見つけました。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
于 2015-04-17T09:27:32.683 に答える
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し、プロパティ自体を取得するために使用し、プロパティに関する情報を取得します)。

ほとんどの場合、これで問題なく動作する可能性がありますが、 andのproperties両方であるプロパティのリストのみを返すことに注意してください (オブジェクトのメソッド内で呼び出す場合でも、これは true です)。既定では、経由で追加されたプロパティはこれらの両方の基準を満たしますが、追加後に属性を変更することは可能であり、ソリューションには表示されません。オブジェクトを呼び出す場合も同様です。Hidden = falseGetAccess = publicpropertiesaddpropfieldnames

ispropオブジェクトに目的のプロパティがあるかどうかを直接確認するために使用することもできます。これは、プロパティがHidden、またはであっても機能しますGetAccess = private。便利なことに、オブジェクトの配列で機能ispropするため、 class のオブジェクトの配列を作成し、DynamicClass適用ispropして論理値の配列を取得できます。

しかし、すべてを確実に取得する唯一の方法 (プライベートかどうか、非表示かどうか、事前にプロパティの名前を知っているかどうか) は、オブジェクトを一時的に構造体にダンプしてから、@ のようにフィールド名を取得することです。マレクは提案します。

于 2015-04-17T14:06:48.393 に答える