このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
プロパティに関する情報の取得
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.property
の Name
プロパティ内に含まれている char
ベクトルの最初と最後の文字 (C
と t
) を返します。
mc.PropertyList(1).Name([1 end])
ans = Ct
特定の属性をもつプロパティの検出方法
この例では、特定の属性値のあるプロパティを検出する関数を実装します。たとえば、次のようなことができます。
定数プロパティ (
Constant
属性の設定がtrue
) を定義するオブジェクトを検出します。どのプロパティが読み取り専用 (
GetAccess = public
、SetAccess = private
) かを判別します。
関数 findAttrValue
は、指定された属性を設定するプロパティ名の cell 配列を返します。関数は、以下の手法を使用してメタデータからの情報にアクセスします。
入力引数
obj
がchar
ベクトルの場合、meta.class.fromName
静的メソッドを使用すると、meta.class
オブジェクトを取得できます。入力引数
obj
がオブジェクトの場合、関数metaclass
を使用するとmeta.class
オブジェクトを取得できます。各プロパティには、関連付けられた
meta.property
オブジェクトがあります。これらのオブジェクトをmeta.class
PropertyList
プロパティから取得します。要求されたプロパティの属性が有効な属性名かどうかを判別するには、
handle
クラスのfindprop
メソッドを使用します。すべてのプロパティ属性は、meta.property
オブジェクトのプロパティです。ステートメントfindobj(mp,'PropertyName')
は、meta.property
オブジェクトmp
にPropertyName
と呼ばれるプロパティがあるかどうかを判定します。動的フィールド名を使用して
meta.property
オブジェクト プロパティを参照します。たとえば、attrName = 'Constant'
の場合、MATLAB は、式mp.(attrName)
をmp.Constant
に変換します。オプションである 3 番目の引数を使用すると、
GetAccess
やSetAccess
など、属性値が論理値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'});
以下のように private
の SetAccess
のあるプロパティを検出します。
findAttrValue(mapobj,'SetAccess','private')
ans = 'Count' 'KeyType' 'ValueType' 'serialization'
以下のように public
の GetAccess
のあるプロパティを検出します。
findAttrValue(mapobj,'GetAccess','public')
ans = 'Count' 'KeyType' 'ValueType'