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