测试运行时类是否存在属性

时间:2013-03-13 15:09:07

标签: intersystems-cache objectscript

这样的事情:

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

我考虑做这样的事情:

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

然后循环遍历属性,但是,我需要能够使用任何类,而不仅仅是%class

2 个答案:

答案 0 :(得分:4)

对于简单的面向对象方法,您可以使用以下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 :(得分:0)

如果运行时速度对您很重要,您可能还想使用生成器方法(Cache对象中非常好的功能之一)。

例如:

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
}