Как правильно использовать отражение в AX?
Иногда, когда мне нужно сделать более сложную вещь, чем изменить одно значение в источнике данных, я бы хотел какой-то метод на вызывающей стороне. Например, у меня есть форма А с обзором. Форма A имеет метод setName() (я определяю). Я открываю связанную деталь (форма B). Я что-то изменить, и я хочу вызвать setName на вызывающем абоненте.
В настоящее время я делаю это следующим образом
element.args().caller().setName();
но я ищу более идиоматический способ. Итак, как правильно вызывать метод на вызывающей стороне в AX 2012 R3?
2 ответа
Вы можете взглянуть на вызов методов в форме вызова, но identifierStr
устарела в AX 2012. Насколько я знаю, нет способа проверить методы формы во время компиляции.
Но я бы предложил избегать методов на формах. Поместите их в класс обработчика формы, затем вы можете использовать methodStr
функция для проверки метода.
Похоже, вам нужно изменить методологию разработки, если вы ссылаетесь на это множество методов вызывающей формы. Вы бы в основном сделали это для звонка doRefresh
или звонит updateDesign
, которые оба являются обычно созданными методами на формах. Помимо обновления дизайна и обновления, вы должны использовать обработчик формы класса.
Если вы должны сделать обратный вызов, вы можете проверить, выполнив:
if (formHasMethod(element.args().caller(), identifierstr(updateDesign)))
{
element.args().caller().updateDesign();
}
Вы можете передать свой класс в качестве абонента. Вот простой пример кода:
\Forms\Form1\Designs\Design\[Group:Group]\Button:Button\Methods\clicked
:
void clicked()
{
FormRun formRun;
Args args = new Args(formstr(Form2));
TestClass testLocal = new TestClass();
testLocal.parmTestVar('ZZZ');
args.caller(testLocal);
formRun = classfactory.formRunClass(args);
formRun.init();
formRun.run();
formRun.wait(true);
}
\Forms\Form2\Methods\init
:
public void init()
{
TestClass testClass;
super();
testClass = element.args().caller() as testClass;
info(strFmt("%1", testClass.parmTestVar()));
}
смотреть на \Forms\SalesTable
а также \Classes\SalesTableForm
или же \Classes\SysCompare\startCompareOfContextProvider
и init
метод
identifierStr
не амортизируется. Это обычная встроенная функция, но вы получите предупреждение о наилучшей практике, если будете использовать identifierStr
функция. Это связано с тем, что проверка существования не выполняется для identifierStr
, Попробуйте использовать более конкретную встроенную функцию, если она доступна. См. http://msdn.microsoft.com/en-us/library/aa626893.aspx