2015-02-19 6 views
2

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

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

ответ

3

Ничего не невозможно. Все в Caché может быть создано программно. И Классы не являются исполнением. Существует по крайней мере два способа сделать это:

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

Все определения любых классов, определенных в других классах. Который вы можете найти в пакете% 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

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

Смежные вопросы