访问缓存对象脚本中的实例变量



我有一个例程,我使用反射动态实例化持久对象。该对象的一个属性(也是一个持久对象(在尝试使用反射 ($Property( 实例化它时失败。它失败,因为该属性已从数据库中删除。这是有道理的,但我似乎无法获得该属性的 ID (23(。当我 Z 处理对象时,我可以在打印输出中看到属性 ID。

+----------------- swizzled references ---------------
|      i%PropID = 23
|      r%PropID = ""

我无法弄清楚如何访问 i%ProdID 值。如果有人能帮忙,我将不胜感激。

我正在使用递归来获取对象的属性和每个属性的后续属性(如果它们扩展持久(等等,但是在属性实际上没有持久化(以某种方式被删除(的情况下,我仍然想获取 id。我想过使用 sql,但如果可能的话,我想远离它。

解决方案是覆盖该属性对象的 getter,解释如下:

https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_propmethods

S getter = propertyName_"GetObjectId"
try {
S id = $METHOD(object, getter)
} catch (ex) {}
return $G(id)

i%<PropertyName>以及r%<PropertyName>只是访问此属性的原始数据的特殊语法。如果要获取此属性的值,则必须使用原始属性名称,PropID在您的情况下。
要获取特定类的属性列表,您可以使用类%Dictionary.ClassDefinition%Dictionary.PropertyDefinition,以编程方式阅读类的完整定义并执行任何您想要的操作,您可能会觉得有趣。

您可以使用未记录的调用来获取 i% 值,但即使存在 i% 属性也是未记录的,以及访问其值的函数。

获取从数据库中删除的子对象 ID 的最佳文档方法是 GetStored 调用:

write ##class(parent.Class).ProdIDGetStored(ParentID) 

应从数据库返回子 ID(在您的情况下为 23(

最新更新