5

我正在尝试找出<cfscript>在 ColdFusion 9 中调用动态方法的正确语法。我尝试了许多变体并进行了很好的搜索。

<cfinvoke>显然是我想要的标签,但遗憾的是我不能在我的纯cfscript组件中使用它,因为它是在 ColdFusion 10 中实现的。

coldfusion 9动态调用方法

我在我的 CFC 中尝试了以下操作:

/** Validate the method name **/
var resources = getResources();
if (structKeyExists(variables.resources, name)) {
  variables.resourceActive[name] = true;
  var reflectionMethod = resources[name];
  var result = "#reflectionMethod.getMethodName()#"(argumentCollection = params);
}

的返回值reflectionMethod.getMethodName()是我要调用的方法名称。它是 100% 返回正确的值(方法的名称),其中该方法被正确定义和访问,

我的错误是该行的语法错误。

4

2 回答 2

14

你不想得到方法,你想得到实际的方法,例如:

function getMethod(string method){
    return variables[method];
}

调用,因此:

theMethod = getMethod(variableHoldingMethodName);
result = theMethod();

不幸的是,不能简单地这样做:

result = getMethod(variableFoldingMethodName)();

或者:

result = myObject[variableFoldingMethodName]();

因为 CF 解析器不喜欢括号或方括号的双重化。

我建议的方法需要注意的是,它将方法从 CFC 中提取出来,因此它将在调用代码的上下文中运行,而不是在 CFC 实例中运行。根据方法中的代码,这可能很重要,也可能无关紧要。

另一种选择是将静态命名的方法注入对象,例如:

dynamicName = "foo"; // for example
myObject.staticName = myObject[dynamicName];
result = myObject.staticName(); // is actually calling foo();
于 2012-09-27T23:30:22.857 回答
0

假设该方法在您当前的(变量)范围内,您可以尝试:

var result = variables[reflectionMethod.getMethodName()](argumentCollection = params);
于 2012-09-27T23:13:33.727 回答