1

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

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

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

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

4

3 回答 3

0

i%<PropertyName>以及访问此属性的原始数据的r%<PropertyName>特殊语法。如果要获取此属性的值,则必须使用原始属性名称PropID
要获取特定类的属性列表,您可以使用 classes%Dictionary.ClassDefinition%Dictionary.PropertyDefinition,以任何您可能感兴趣的方式以编程方式阅读类的完整定义并做任何您想做的事情。

于 2018-08-12T21:58:22.393 回答
0

解决方案是覆盖该属性对象的 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)
于 2018-08-16T01:34:52.040 回答
0

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

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

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

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

于 2018-08-13T00:09:33.063 回答