在AX中使用反射的正确方法是什么?

时间:2014-09-05 08:46:19

标签: axapta microsoft-dynamics x++ dynamics-ax-2012 dynamics-ax-2012-r3

有时,当我需要做更复杂的事情而不是更改数据源中的一个值时,我想在调用者上使用一些方法。例如,我有一个概述的表格A.表单A有方法setName()(我定义)。我打开一个相关的细节(表格B)。我改变了一些东西,我想在调用者上调用setName。

现在我正按照以下方式做这件事

element.args().caller().setName();

但我正在寻找更惯用的方式。那么在AX 2012 R3中调用方法的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

如果引用那么多调用者形式的方法,听起来你需要改变你的开发方法。你通常会这样做来调用doRefresh或调用updateDesign,它们通常都是在表单上创建的方法。除了更新设计和refeshing之外,您还应该使用类表单处理程序。

如果您必须进行调用者回调,则可以执行以下操作进行验证:

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

答案 1 :(得分:2)

您可以查看Calling methods on a caller form,但在AX 2012中已弃用identifierStr。据我所知,在编译时无法检查表单方法。

但我建议在表格上避免使用方法。将它们放在表单处理程序类中,然后您可以使用methodStr函数来检查方法。