名前空間に新しいクラスを作成してコンパイルする ObjectScript メソッドを作成することはできますか? つまり、プログラムで新しいクラスを作成して保存します。その場合、後で ObjectScript を使用してこのクラスを編集 (および再コンパイル) できますか?
理由: 文字列変数で定義されたクラス構造があり、この文字列に従って名前空間に新しいクラスを追加する必要があります。
名前空間に新しいクラスを作成してコンパイルする ObjectScript メソッドを作成することはできますか? つまり、プログラムで新しいクラスを作成して保存します。その場合、後で ObjectScript を使用してこのクラスを編集 (および再コンパイル) できますか?
理由: 文字列変数で定義されたクラス構造があり、この文字列に従って名前空間に新しいクラスを追加する必要があります。
不可能はない。Caché のすべては、プログラムで作成できます。そして、クラスは実行ではありません。これを行うには、少なくとも 2 つの方法があります。
他のクラスで定義されているすべてのクラスの定義。パッケージ %Dictionary で見つけることができます。
%Dictionary で定義されたクラス自体。クラス定義。クラスの任意の部分を定義するためのいくつかのプロパティがあります。したがって、これは 1 つのプロパティを持つクラスを作成する単純なコードです。
set clsDef=##class(%Dictionary.ClassDefinition).%New()
set clsDef.Name="package.classname"
set clsDef.Super="%Persistent"
set propDef=##class(%Dictionary.PropertyDefinition).%New()
set propDef.Name="SomeProperty"
set propDef.Type="%String"
do clsDef.Properties.Insert(propDef)
do clsDef.%Save()
また、最新バージョンでは、クラスを作成/変更する方法がもう 1 つあります。Studioで表示できるように、クラスのテキストがある場合。次に、クラス%Compiler.UDL.TextServicesを使用して Caché にロードできます。
はい、そうです。%Dictionary.ClassDefinition
および関連する%Dictionary.*Definition
クラス (特に%Dictionary.PropertyDefinition
、%Dictionary.MethodDefinition
および%Dictionary.IndexDefinition
) を使用して、クラスを作成および/または変更することをお勧めします。文字列にデータの妥当な表現が含まれていれば、この方法でクラスを作成できるはずです。
実際のクラスのドキュメントは、http://docs.intersystems.com/cache20141/csp/documatic/%25CSP.Documatic.cls?CLASSNAME=%25Dictionary.ClassDefinitionで入手できます。
その後、 を呼び出してクラスをコンパイルできます$system.OBJ.Compile("YourPackage.YourClass","ck")
。
(注: 文字列にクラスのエクスポートされた XML 定義が含まれている場合は、XML 表現をストリームに書き込んでから、呼び出し$system.OBJ.LoadStream()
て XML 定義をインポートすることもできます。これは、最初にエクスポートされたクラス定義がある場合にのみお勧めします。 )