【问题标题】:Intersystems caché - programmatically create new classIntersystems caché - 以编程方式创建新类
【发布时间】:2015-02-19 13:16:58
【问题描述】:

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

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

【问题讨论】:

    标签: intersystems-cache objectscript


    【解决方案1】:

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

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

    在其他类中定义的任何类的所有定义。您可以在包 %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 中看到它。然后,您可以将其加载到 Caché 中,类为 %Compiler.UDL.TextServices

    【讨论】:

      【解决方案2】:

      是的,是的。您可能希望使用%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 定义。如果您有导出的 XML 定义,我只会推荐这个类定义开始。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-15
        • 2017-05-07
        • 2020-04-21
        • 1970-01-01
        • 1970-01-01
        • 2015-07-13
        • 2013-02-26
        相关资源
        最近更新 更多