Динамический вызов Dynamics AX динамически - PullRequest
2 голосов
/ 01 февраля 2012

Я хочу создать класс, который может динамически вызывать методы в других классах по имени. В идеале он будет принимать имена классов и методов, а также набор параметров. dictClass хорошо работает для статических методов, но, похоже, не работает для методов экземпляра.

Есть ли способ заставить следующий код работать для нестатических методов?

[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;
}

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Следующий код должен помочь. Приведенный ниже код может использовать имя класса или взять объект нужного типа, который уже создан.

Самая большая проблема была связана с передачей параметров. Поскольку существует переменная номер, я использую оператор 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 голос
/ 01 февраля 2012
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(); 
}

Ссылка на MSDN

Также попробуйте просмотреть DictClass.MakeObject:

Ссылка на MSDN (MakeObject)

...