像这样的东西:
##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
}
如果运行时速度对您很重要,您可能还想使用生成器方法(缓存对象中非常好的特性之一)。
例如:
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
}