Intersystems Caché - программно создать новый класс

Можно ли написать метод ObjectScript, который создаст новый класс в пространстве имен и скомпилирует его? Я имею в виду программно создать новый класс и сохранить его. Если да, могу ли я редактировать этот класс позже, используя ObjectScript (и перекомпилировать)?

Причина: у меня есть структура класса, определенная в строковой переменной, и мне нужно добавить новый класс в пространство имен в соответствии с этой строкой.

2 ответа

Решение

Невозможное возможно. Все в Caché может быть создано программно. И, Классы это не исполнение. Есть как минимум два способа сделать это:

  • Простой SQL-запрос CREATE TABLE, создаст класс.
  • и, как вы уже упоминали, код ObjectScript, который может сделать это.

Все определения любых классов определены в других классах. Который вы можете найти в пакете%Dictionary.
Сам класс определен в% словаре. Определение класса. Которые имеют некоторые свойства, для определения любых частей классов. Итак, это простой код, который создает некоторый класс с одним свойством.

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

Да, это. Вы, вероятно, хотите использовать %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. Я бы порекомендовал это, только если у вас есть экспортированное определение класса для начала.)

Другие вопросы по тегам