有時,當我需要做更復雜的東西而不是更改數據源中的一個值時,我想調用一些方法。例如,我有一個概述的表單A。表單A有方法setName()(我定義)。我打開了一個相關的細節(表單B)。我改變了一些東西,我想在調用者上調用setName。什麼是在AX中使用反射的正確方法?
Nowdays我做它在以下方式
element.args().caller().setName();
但我尋找更多的慣用方式。那麼在AX 2012 R3的調用者中調用方法的正確方式是什麼?
有時,當我需要做更復雜的東西而不是更改數據源中的一個值時,我想調用一些方法。例如,我有一個概述的表單A。表單A有方法setName()(我定義)。我打開了一個相關的細節(表單B)。我改變了一些東西,我想在調用者上調用setName。什麼是在AX中使用反射的正確方法?
Nowdays我做它在以下方式
element.args().caller().setName();
但我尋找更多的慣用方式。那麼在AX 2012 R3的調用者中調用方法的正確方式是什麼?
您可以看看Calling methods on a caller form,但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