C# Dynamics AX动态调用非静态方法
我想创建一个能够按名称动态调用其他类中的方法的类。理想情况下,它将接受类和方法名称以及一组参数。dictClass在静态方法上运行良好,但在实例方法上似乎不起作用 有没有办法使以下代码适用于非静态方法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
[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;
}