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 に答える