Intersystemscaché - 以编程方式创建新类

时间:2015-02-19 13:16:59

标签: intersystems-cache objectscript

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

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

2 个答案:

答案 0 :(得分:3)

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

  • 简单的SQL查询CREATE TABLE,将创建一个类。
  • 正如您已经提到过的ObjectScript Code,它可以做到这一点。

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

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

在最新版本中,还有一种创建/更改类的方法。如果你有类的文本,你可以在Studio中看到它。然后,您可以使用课程%Compiler.UDL.TextServices

在Caché中加载它

答案 1 :(得分:1)

是的,确实如此。您可能希望使用%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定义。我只会建议你这样做以...开头的导出类定义。)