1

このようなもの:

##class(MyApp.MyClass).%HasProperty("SomeProperty").  

私はこのようなことをすることを検討しました:

set classDefinition = ##class(%Dictionary.CompiledClass).%OpenId(%class.Name)

次に、プロパティをループしますが、クラスだけでなく、任意のクラスを使用できる必要があります。%class

4

2 に答える 2

4

単純な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
}
于 2013-03-13T16:02:36.747 に答える
0

実行時の速度が重要な場合は、ジェネレーターメソッド(キャッシュオブジェクトの非常に優れた機能の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
}
于 2013-03-13T18:33:57.133 に答える