我有一个例程,其中我使用反射来动态实例化持久对象。当我尝试使用反射($ Property)实例化对象时,该对象的属性之一(也是持久对象)将失败。失败是因为该属性已从数据库中删除。这是有道理的,但我似乎无法获取该属性的ID(23)。当我ZWrite对象时,我可以在打印输出中看到属性ID。
+----------------- swizzled references ---------------
| i%PropID = 23
| r%PropID = ""
我还无法弄清楚如何访问i%ProdID值。如果有人可以帮助我将不胜感激。
我正在使用递归来获取对象的属性以及每个属性的后续属性(如果它们具有持久性),等等,但是在该属性实际上未被持久化(以某种方式被删除)的情况下,我仍然想获取ID。我曾经考虑过使用sql,但是我想尽可能避免使用它。
答案 0 :(得分:0)
i%<PropertyName>
和r%<PropertyName>
只是special syntax,可以访问此属性的原始数据。如果要获取此属性的值,则必须使用原始属性名称PropID
。
要获取特定类的属性列表,可以使用类%Dictionary.ClassDefinition
和%Dictionary.PropertyDefinition
,以您可能会感兴趣的任何方式以编程方式阅读类的完整定义并执行所需的任何操作。
答案 1 :(得分:0)
您可以使用未记录的调用来获取i%值,但是即使i%属性的存在也没有记录,以及用于访问其值的函数。
获取从数据库中删除的子对象的ID的最好的记录方法是GetStored调用:
write ##class(parent.Class).ProdIDGetStored(ParentID)
应从数据库中返回子ID(在您的情况下为23)
答案 2 :(得分: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)