1

文档说这是允许的:

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

我想做这个:

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

我收到一个错误:

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

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

4

2 回答 2

5

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

Property Permissions As list of MyPackage.MyClass;
于 2012-11-14T06:22:10.047 回答
1

是的,当涉及到类型时,属性有时与方法的工作方式不同。这是这里的一个问题,因为您可以以直接的方式设置方法声明的返回值的类参数,但这并不总是适用于属性类的类参数。

我不认为它的工作方式被完整记录,但这里有一些我的观察:

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

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

PropertyClass = %XML.PropertyParameters

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

你也许可以用这种方式破解一些东西——我从来没有尝试过类似的东西。

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

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

这有点烦人,因为您必须记住每次都要手动执行,您可能会忘记。或者,未来的维护者可能现在不会这样做。

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

于 2012-11-13T21:59:34.067 回答