C# Dynamics AX动态调用非静态方法

C# Dynamics AX动态调用非静态方法,c#,methods,static,axapta,C#,Methods,Static,Axapta,我想创建一个能够按名称动态调用其他类中的方法的类。理想情况下,它将接受类和方法名称以及一组参数。dictClass在静态方法上运行良好,但在实例方法上似乎不起作用 有没有办法使以下代码适用于非静态方法 [SysEntryPointAttribute] public str methodExecute(str className, str methodName, str params) { DictClass dictClass; anytype

我想创建一个能够按名称动态调用其他类中的方法的类。理想情况下,它将接受类和方法名称以及一组参数。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;
}

还可以尝试查看DictClass.MakeObject:


下面的代码应该可以做到这一点。下面的代码既可以使用类名,也可以接收已实例化的所需类型的对象

最大的问题是如何传递参数。因为有一个变量,所以我使用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;
}

也许我没有看到明显的问题,但我希望能够传入一个方法名和一组参数,以便动态调用一个非静态方法。这似乎不行。我已经澄清了这个问题,以便更好地解释我要做的事情。谢谢你的回复。
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;
}