Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

プロパティに関する情報の取得

meta.property オブジェクト

meta.property クラスを使用してプロパティ属性の値を確認します。meta.property オブジェクトの書き込み可能なプロパティは、関連付けられたプロパティの属性に対応しています。meta.property の書き込み可能なプロパティの値は、クラス定義内で指定されている属性値に対応しています。

プロパティの meta.property オブジェクトを meta.class オブジェクトから取得できます。クラスの meta.class オブジェクトを取得するには、次のようにします。

  • クラスのオブジェクトに対して関数 metaclass を使用します。

  • ? 演算子をクラス名と共に使用します。

たとえば、BasicHandle クラスは次のようにして 3 つのプロパティを定義します。

classdef BasicHandle < handle
   % BasicHandle  Inherits from handle superclass
   % Defines 1 public and 2 private properties.
   properties (SetAccess = private)
      Date = date
      PassKey = randi(9,[1,7]) 
   end
   properties
      Category {mustBeMember(Category,{'new','change'})} = 'new'
   end
end

? 演算子とクラス名を使用した meta.class オブジェクトの作成:

mc = ?BasicHandle
mc = 

  class with properties:

                    Name: 'BasicHandle'
             Description: 'BasicHandle  Inherits from handle superclass'
     DetailedDescription: '  Defines 1 public and 2 private properties.'
                  Hidden: 0
                  Sealed: 0
                Abstract: 0
             Enumeration: 0
         ConstructOnLoad: 0
        HandleCompatible: 1
         InferiorClasses: {0×1 cell}
       ContainingPackage: [0×0 meta.package]
                 Aliases: [0×1 string]
    RestrictsSubclassing: 0
            PropertyList: [3×1 meta.property]
              MethodList: [24×1 meta.method]
               EventList: [1×1 meta.event]
   EnumerationMemberList: [0×1 meta.EnumeratedValue]
          SuperclassList: [1×1 meta.class]

PropertyList という名前の meta.class オブジェクト プロパティには、クラスによって定義されたプロパティごとに 1 配列ずつ、meta.property オブジェクトの配列が含まれています。たとえば、要素 1 内の meta.property オブジェクトに関連付けられているプロパティの名前は、以下のとおりです。

mc.PropertyList(1).Name
ans =

Date

meta.class オブジェクトには、非表示プロパティを含むすべてのプロパティの meta.property オブジェクトが含まれています。関数 properties はパブリック プロパティのみを返します。

ハンドル クラスでは handle findprop メソッドを使用して、特定のプロパティの meta.property オブジェクトを取得します。

たとえば、BasicHandle クラスの Category プロパティの meta.property オブジェクトを検出します。

h = BasicHandle;
mp = findprop(h,'Category')
mp = 

  property with properties:

                   Name: 'Category'
            Description: ''
    DetailedDescription: ''
              GetAccess: 'public'
              SetAccess: 'public'
              Dependent: 0
               Constant: 0
               Abstract: 0
              Transient: 0
                 Hidden: 0
          GetObservable: 0
          SetObservable: 0
               AbortSet: 0
            NonCopyable: 0
              GetMethod: []
              SetMethod: []
             HasDefault: 1
           DefaultValue: 'new'
          DefiningClass: [1×1 meta.class]

meta.property の表示には、BasicHandle オブジェクトの既定の Category プロパティの 1 つが以下であることが示されています。

  • パブリックの GetAccess および SetAccess をもつ

  • 既定値 new をもつ

プロパティの属性の一覧は、プロパティの属性の表を参照してください。

メタクラス オブジェクトのインデックス化の方法

meta.class オブジェクト プロパティから直接、他のメタクラス オブジェクトにアクセスできます。たとえば、以下のステートメントは、

mc = ?containers.Map;

meta.class オブジェクトを以下のように返します。

class(mc)
ans =

meta.class

PropertyList meta.class プロパティを参照すると、以下のように containers.Map クラスの各プロパティに対して 1 つの meta.property オブジェクトがある配列が返されます。

class(mc.PropertyList)
ans =

meta.property

各配列要素は 1 つの meta.property オブジェクトです。

mc.Properties(1)
ans = 

    [1x1 meta.property]

meta.property オブジェクトの Name プロパティには、プロパティの名前である char ベクトルが含まれています。

class(mc.PropertyList(1).Name)
ans =

char

標準の MATLAB® インデックス処理を適用すると、メタクラス オブジェクト内の情報にアクセスできます。

たとえば、meta.class PropertyList プロパティには meta.property オブジェクトの配列が含まれています。次の式はこの配列内の最初の meta.property オブジェクトにアクセスし、meta.propertyName プロパティ内に含まれている char ベクトルの最初と最後の文字 (Ct) を返します。

mc.PropertyList(1).Name([1 end])
ans =

Ct

特定の属性をもつプロパティの検出方法

この例では、特定の属性値のあるプロパティを検出する関数を実装します。たとえば、次のようなことができます。

  • 定数プロパティ (Constant 属性の設定が true) を定義するオブジェクトを検出します。

  • どのプロパティが読み取り専用 (GetAccess = publicSetAccess = private) かを判別します。

関数 findAttrValue は、指定された属性を設定するプロパティ名の cell 配列を返します。関数は、以下の手法を使用してメタデータからの情報にアクセスします。

  • 入力引数 objchar ベクトルの場合、meta.class.fromName 静的メソッドを使用すると、meta.class オブジェクトを取得できます。

  • 入力引数 obj がオブジェクトの場合、関数 metaclass を使用すると meta.class オブジェクトを取得できます。

  • 各プロパティには、関連付けられた meta.property オブジェクトがあります。これらのオブジェクトを meta.class PropertyList プロパティから取得します。

  • 要求されたプロパティの属性が有効な属性名かどうかを判別するには、handle クラスの findprop メソッドを使用します。すべてのプロパティ属性は、meta.property オブジェクトのプロパティです。ステートメント findobj(mp,'PropertyName') は、meta.property オブジェクト mpPropertyName と呼ばれるプロパティがあるかどうかを判定します。

  • 動的フィールド名を使用して meta.property オブジェクト プロパティを参照します。たとえば、attrName = 'Constant' の場合、MATLAB は、式 mp.(attrName)mp.Constant に変換します。

  • オプションである 3 番目の引数を使用すると、GetAccessSetAccess など、属性値が論理値 true または false でない属性の値を指定できます。

function cl_out = findAttrValue(obj,attrName,varargin)
   if ischar(obj)
      mc = meta.class.fromName(obj);
   elseif isobject(obj)
      mc = metaclass(obj);
   end
   ii = 0; numb_props = length(mc.PropertyList);
   cl_array = cell(1,numb_props);
   for  c = 1:numb_props
      mp = mc.PropertyList(c);
      if isempty (findprop(mp,attrName))
         error('Not a valid attribute name')
      end
      attrValue = mp.(attrName);
      if attrValue
         if islogical(attrValue) || strcmp(varargin{1},attrValue)
            ii = ii + 1;
            cl_array(ii) = {mp.Name};
         end
      end
   end
   cl_out = cl_array(1:ii);
end

プロパティ属性の検出

containers.Map オブジェクトを以下のように定義します。

mapobj = containers.Map({'rose','bicycle'},{'flower','machine'});

以下のように privateSetAccess のあるプロパティを検出します。

findAttrValue(mapobj,'SetAccess','private')
ans = 

    'Count'    'KeyType'    'ValueType'    'serialization'

以下のように publicGetAccess のあるプロパティを検出します。

findAttrValue(mapobj,'GetAccess','public')
ans = 

    'Count'    'KeyType'    'ValueType'

関連するトピック