【问题标题】:Dynamics AX Call Non-Static Method DynamicallyDynamics AX 动态调用非静态方法
【发布时间】:2025-12-26 02:35:06
【问题描述】:

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

【问题讨论】:

    标签: c# methods static axapta


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:
      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)

      【讨论】:

      • 也许我没有看到明显的情况,但我希望能够传入方法名称和参数集合,以便动态调用非静态方法。这似乎不会那样做。
      • 我已经稍微澄清了这个问题,以便更好地解释我想要做什么。感谢您的回复。