Как правильно использовать отражение в 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

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