是否可以编写ObjectScript方法,该方法将在命名空间中创建新的类并对其进行编译?我的意思是以编程方式创建新的类并存储它。如果是,我以后可以使用ObjectScript编辑这个类吗(并重新编译)?
原因:我在字符串变量中定义了类结构,我需要根据这个字符串向命名空间添加新的类
没有什么是不可能的。Caché中的所有内容都可以通过编程方式创建。而且,类不是执行。至少有两种方法:
- 简单的SQL查询CREATE TABLE,将创建一个类
- 正如您已经提到的ObjectScript Code,它可以做到这一点
在其他类中定义的任何类的所有定义。您可以在程序包%字典中找到
在%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é中加载它
%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定义。我只建议您从导出的类定义开始。)