是否可以编写ObjectScript方法,该方法将在命名空间中创建新类并进行编译?我的意思是以编程方式创建新类并存储它。如果是这样的话,我以后可以使用ObjectScript编辑这个类(并重新编译)吗?
原因:我在string变量中定义了类结构,我需要根据这个字符串向命名空间添加新的类。
发布于 2015-02-19 14:09:09
没有什么不可能。Caché中的所有内容都可以通过编程方式创建。而且,类不是一种执行。至少有两种方法可以做到:
定义在其他类中的任何类的所有定义。你可以在包%字典里找到。
在%Diction.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é中加载它。
发布于 2015-02-19 13:58:13
是的,是这样的。您可能希望使用%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定义。我只建议您首先使用导出的类定义。)
https://stackoverflow.com/questions/28607416
复制相似问题