Intersystems Cache - 更正%ListOfObjects的语法

时间:2012-11-13 20:52:14

标签: intersystems-cache intersystems

documentation说允许这样做:

ClassMethod GetContacts() As %ListOfObjects(ELEMENTTYPE="ContactDB.Contact") 
[WebMethod]   

我想这样做:

Property Permissions As %ListOfObjects(ELEMENTTYPE="MyPackage.MyClass");

我收到错误:

  

错误#5480:未声明属性参数:   MyPackage.Myclass:的ElementType

那么,我真的必须创建一个新类并为其中的每个列表设置ELEMENTTYPE参数吗?

2 个答案:

答案 0 :(得分:5)

属性中%ListOfObjects的正确语法就是这个

Property Permissions As list of MyPackage.MyClass;

答案 1 :(得分:1)

是的,对于类型而言,属性有时与方法的工作方式不同。这是一个问题,因为您可以以简单的方式设置方法声明的返回值的类参数,但这并不总是适用于属性类的类参数。

我不认为它的工作方式是完全记录的,但这是我的一些观察结果:

如果属性的类型是数据类型(通常与对象的处理方式不同),可以在属性中放入类参数。

如果查看%XML.Adaptor类,它会有关键字赋值语句

PropertyClass = %XML.PropertyParameters

这似乎将其参数添加到声明它为PropertyClass的类的所有属性。这似乎是Intersystems想要实现某些东西(XML适配器)并且意识到对象的实现没有干净地提供它的一个例子,所以他们在类编译器中攻击了一些新东西。我真的找不到太多文档,因此不清楚它是否被认为是可用的API或实施细节是否会破损。

你可能会以这种方式破解某些东西 - 我从来没有尝试过类似的东西。

可能更简单的解决方法是初始化%OnNew和%OnOpen中的Permissions属性。无论如何,您可能想要一个零元素数组,而不是null。

如果查看%ListOfObjects的实现,可以看到您尝试设置的类参数只是为ElementType属性提供了一个默认值。因此,在创建%ListOfObjects的实例后,您只需将其ElementType属性设置为正确的元素类型。

这有点烦人,因为你必须记住每次都是手工做,你可能会忘记。或者在路上的维护者现在可能不会这样做。

您可能希望通过创建一个初始化所有需要它的属性的生成器方法来减少烦恼。如果Intersystems有一些适当的系统来注释具有任意值的属性(这样你就可以知道每个属性使用什么ElementType),这将很容易。但他们没有,所以你必须做一些事情,比如使用XData块或类方法来滚动你自己的注释。这可能是不值得的,除非你有更多的注释用例而不仅仅是这个,所以我会手动做,直到发生这种情况,如果有的话。