0

有時,當我需要做更復雜的東西而不是更改數據源中的一個值時,我想調用一些方法。例如,我有一個概述的表單A。表單A有方法setName()(我定義)。我打開了一個相關的細節(表單B)。我改變了一些東西,我想在調用者上調用setName。什麼是在AX中使用反射的正確方法?

Nowdays我做它在以下方式

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

但我尋找更多的慣用方式。那麼在AX 2012 R3的調用者中調用方法的正確方式是什麼?

回答

1

您可以看看Calling methods on a caller form,但identifierStr在AX 2012中已棄用。據我所知,無法在編譯時檢查窗體方法。

但我會建議避免在窗體上的方法。將它們放在表單處理程序類中,然後可以使用methodStr函數來檢查方法。

2

這聽起來像是你需要改變你的開發方法,如果你引用那麼多的調用者形式的方法。你大多會這樣做,通過調用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\startCompareOfContextProviderinit方法

identifierStr不予折舊。這是一個正常的內部函數,但如果使用identifierStr函數,則會得到最佳實踐警告。這是因爲identifierStr沒有執行存在檢查。如果可用的話,嘗試使用更具體的內部函數。見http://msdn.microsoft.com/en-us/library/aa626893.aspx