在 Cache Objectscript 中访问实例变量

Access instance variables in Cache Objectscript

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

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

我无法弄清楚如何访问 i%ProdID 值。如果有人可以提供帮助,我将不胜感激。

我正在使用递归来获取对象的属性和每个 属性 的后续属性(如果它们扩展持久化)等等,但在 属性 实际上没有持久化的情况下(不知何故被删除),我还是想得到这个ID。我考虑过使用 sql,但如果可能的话,我想远离它。

i%<PropertyName> 以及 r%<PropertyName> 只是 special syntax 获取此 属性 的原始数据。如果您想获得此 属性 的值,您必须使用原始 属性 名称,在您的情况下为 PropID
要获取特定 class 的属性列表,您可以使用 classes %Dictionary.ClassDefinition%Dictionary.PropertyDefinition,任何您可能感兴趣的方式来阅读 [=19] 的完整定义=] 以编程方式做任何你想做的事。

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

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

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

应该return 来自数据库的儿童 ID(在您的情况下为 23)

解决方案是覆盖 属性 对象的 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)