我想创建一个能够按名称动态调用其他类中的方法的类。理想情况下,它将接受类名和方法名以及参数集合。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;
}发布于 2012-02-09 08:30:32
下面的代码应该可以做到这一点。下面的代码既可以使用类名,也可以接受已实例化的所需类型的对象。
最大的问题是如何传递参数。因为有一个变量number,所以我使用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;
}发布于 2012-02-02 03:17:38
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)
https://stackoverflow.com/questions/9098704
复制相似问题