このようなもの:
##class(MyApp.MyClass).%HasProperty("SomeProperty").
私はこのようなことをすることを検討しました:
set classDefinition = ##class(%Dictionary.CompiledClass).%OpenId(%class.Name)
次に、プロパティをループしますが、クラスだけでなく、任意のクラスを使用できる必要があります。%class
このようなもの:
##class(MyApp.MyClass).%HasProperty("SomeProperty").
私はこのようなことをすることを検討しました:
set classDefinition = ##class(%Dictionary.CompiledClass).%OpenId(%class.Name)
次に、プロパティをループしますが、クラスだけでなく、任意のクラスを使用できる必要があります。%class
単純なOOアプローチの場合、次のAPIを使用できます。
Set tPropExists = ##class(%Dictionary.CompiledProperty).IDKEYExists("SomeClass","SomeProperty")
これにより、クラス定義データをロードしてそのプロパティをループする(したがって、これらのプロパティのデータもロードする)よりも、実行時のコストがはるかに少なくなります。
それでもアプリケーションクラスのヘルパーメソッドを作成する%HasProperty()
場合は、次の基本メソッドを使用できます(Cache 2010.2以降を使用していると仮定します-$this
特別な変数と$classname()
関数は2010.2で追加されたと思いますが、それは2010.1。):
ClassMethod %HasProperty(pPropName As %String = "") As %Boolean
{
Set tHasProp = 0
If (pPropName '= "") {
Set tHasProp = ##class(%Dictionary.CompiledProperty).IDKEYExists($classname($this),pPropName)
}
Quit tHasProp
}
実行時の速度が重要な場合は、ジェネレーターメソッド(キャッシュオブジェクトの非常に優れた機能の1つ)を使用することもできます。
例えば:
Method PropertyExists(Name) As %Boolean [ CodeMode = generator, ProcedureBlock = 1, ServerOnly = 1 ]
{
Set %code=0
S ClassDef=##class(%Dictionary.CompiledClass).%OpenId(%class)
i '$IsObject(ClassDef) $$$GENERATE(" Q 0") Q $$$OK
I '$IsObject(ClassDef.Properties) $$$GENERATE(" Q 0") Q $$$OK
S Key="" F S Key=ClassDef.Properties.Next(Key) Q:Key="" D
. S CompiledProperty=ClassDef.Properties.GetAt(Key)
. $$$GENERATE(" I Name="""_CompiledProperty.Name_""" Q 1" )
$$$GENERATE(" Q 0")
q $$$OK
}