2012-02-01 25 views
2

我想創建一個能夠按名稱動態調用其他類中的方法的類。理想情況下,它會接受類和方法名稱以及一組參數。 dictClass在靜態方法上可以很好地工作,但似乎不適用於實例方法。Dynamics AX動態調用非靜態方法

有什麼辦法可以使下面的代碼適用於非靜態方法嗎?

[SysEntryPointAttribute] 
public str methodExecute(str className, str methodName, str params) 
{  
DictClass   dictClass; 
anytype    retVal; 
str     connMessage; 
ExecutePermission perm; 

perm = new ExecutePermission(); 

// Grants permission to execute the DictClass.callStatic method. 
// DictClass.callStatic runs under code access security. 
perm.assert(); 

dictClass = new DictClass(className2Id(className)); 

if (dictClass != null) 
{   
    retVal = dictClass.callStatic(methodName); 
    connMessage = strfmt("Return value is %1", retVal); 
} 

// Closes the code access permission scope. 
CodeAccessPermission::revertAssert(); 

return connMessage; 
} 

回答

1

下面的代碼應該做的伎倆。我下面的代碼可以使用一個類名或者接受一個已經實例化的類型的對象。

最大的問題是處理傳遞參數。由於有一個可變數字,我正在使用switch語句將正確數量的參數傳遞給方法。這看起來不太優雅,但我不確定是否有另一種方法來實現這一點。

public static anytype callMethod(str _className, str _methodName, container _parameters, Object _object = null) 
{ 
    DictClass dictClass; 
    anytype returnValue; 
    Object object; 
    ExecutePermission permission; 

    // Grants permission to execute the DictClass.callObject method. 
    // DictClass.callObject runs under code access security. 
    permission = new ExecutePermission(); 
    permission.assert(); 

    if (_object != null) 
    { 
     dictClass = new DictClass(classidget(_object)); 
     object = _object; 
    } 
    else 
    { 
     dictClass = new DictClass(className2Id(_className)); 
     object = dictClass.makeObject(); 
    } 

    if (dictClass != null) 
    { 
     switch (conLen(_parameters)) 
     { 
      case 0: 
       returnValue = dictClass.callObject(_methodName, object); 
       break; 
      case 1: 
       returnValue = dictClass.callObject(_methodName, object, conPeek(_parameters, 1)); 
       break; 
      case 2: 
       returnValue = dictClass.callObject(_methodName, object, conPeek(_parameters, 1), conPeek(_parameters, 2)); 
       break; 
      //... Continue this pattern for the number of parameters you need to support. 
     } 
    } 

    // Closes the code access permission scope. 
    CodeAccessPermission::revertAssert(); 

    return returnValue; 
} 
1
static void Job_Example_DictClass_CallObject(Args _args) 
{ 
    DictClass dictClass; 
    anytype retVal; 
    str  resultOutput; 
    ExecutePermission perm; 

    perm = new ExecutePermission(); 

    // Grants permission to execute the DictClass.callObject method. 
    // DictClass.callObject runs under code access security. 
    perm.assert(); 

    dictClass = new DictClass(classidget(infolog)); 
    if (dictClass != null) 
    { 
     retVal  = dictClass.callObject("toString", infolog); 
     resultOutput = strfmt("Return value is %1", retVal); 
     print resultOutput; 
     pause; 
    } 

    // Closes the code access permission scope. 
    CodeAccessPermission::revertAssert(); 
} 

Reference to MSDN

也可以嘗試尋找到DictClass.MakeObject:

Reference to MSDN (MakeObject)

+0

也許我沒有看到明顯的,但我希望能夠傳遞一個方法名稱和一個參數集合,以動態調用一個非靜態方法。似乎這不會做到這一點。 – Brad 2012-02-02 04:18:19

+0

我已經澄清了一些問題,以更好地解釋我正在嘗試做什麼。感謝您的迴應。 – Brad 2012-02-02 04:20:09