我有一个例程,我使用反射动态实例化持久对象。该对象的一个属性(也是一个持久对象(在尝试使用反射 ($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(