Intersystems caché - 以编程方式创建新的 class

Intersystems caché - programmatically create new class

是否可以编写 ObjectScript 方法,在命名空间中创建新的 class 并进行编译?我的意思是以编程方式创建新的 class 并存储它。如果是这样,我可以稍后使用 ObjectScript 编辑这个 class(并重新编译)吗?

原因:我在字符串变量中定义了class结构,我需要根据这个字符串向命名空间添加新的class。

是的,是的。您可能想利用 %Dictionary.ClassDefinition 和相关的 %Dictionary.*Definition classes(尤其是 %Dictionary.PropertyDefinition%Dictionary.MethodDefinition%Dictionary.IndexDefinition)来创建 and/or修改你的class。如果您的字符串包含一些合理的数据表示,您应该能够以这种方式创建 class。

实际的 class 文档位于 http://docs.intersystems.com/cache20141/csp/documatic/%25CSP.Documatic.cls?CLASSNAME=%25Dictionary.ClassDefinition

然后您可以通过调用 $system.OBJ.Compile("YourPackage.YourClass","ck") 编译 class。

(注意:如果您的字符串包含 class 的导出 XML 定义,您还可以将 XML 表示写入流,然后调用 $system.OBJ.LoadStream()导入 XML 定义。如果您有一个导出的 class 定义,我只会推荐这个。)

没有什么是不可能的。 Caché 中的所有内容都可以通过编程方式创建。而且,类 不是执行。至少有两种方法可以做到:

  • 简单SQL查询CREATE TABLE,将创建一个class。
  • 正如您已经提到的可以执行此操作的 ObjectScript 代码。

在其他 classes 中定义的任何 classes 的所有定义。您可以在包 %Dictionary.
中找到它 class 本身在 %Dictionary.ClassDefinition 中定义。其中有一些属性,用于定义 classes 的任何部分。因此,这是一个创建一些 class 和一个 属性 的简单代码。

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()

在最新版本中,create/change class 多了一种方式。如果您有 class 的文本,您可以在 Studio 中看到它。然后,您可以将其加载到 Caché 中,使用 class %Compiler.UDL.TextServices