ColdFusion 9动态方法调用

5
我正在尝试找到正确的<cfscript>语法来调用ColdFusion 9中的动态方法。我尝试了许多变化并进行了广泛搜索。<cfinvoke>显然是我想要的标签,但不幸的是,由于它是在ColdFusion 10中实现的,我无法在纯cfscript组件中使用它。
例如:coldfusion 9 dynamically call method 我已经在我的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%返回正确的值(即方法名)。
我的错误是在那一行的语法错误。

1
我使用 evaluate() 在 cfscript 中模拟 <cfinvoke>。虽然不完全相同,但到目前为止还没有遇到任何问题。 - jan
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();

谢谢Adam,这很有帮助!不过感觉有些“hacky”,需要做这么多事情。你能详细说明一下你提到的警告吗?涉及/修改变量作用域的方法可能会引起问题,我担心这一点。 - AlexP
你好,Alex。我的解释在评论中太冗长了,但我已经写了一篇文章详细介绍了这个问题:http://adamcameroncoldfusion.blogspot.co.uk/2012/09/functions-and-their-execution-context.html - Adam Cameron
@Adam非常感谢您的答复和进一步花费时间进行详细解释。虽然它不太优雅;-)但现在它已经正常工作了。 - AlexP
1
将一个静态命名方法注入对象?真是太聪明了。 - Gary Stanton

0
假设该方法在您当前(变量)作用域内,您可以尝试以下代码:
var result = variables[reflectionMethod.getMethodName()](argumentCollection = params);

正如Adam所指出的,[括号](圆括号)形式在ColdFusion 9中不起作用。(它在Railo中起作用,我认为在最近的OpenBD版本中也起作用,但OP明确要求CF9。) - Peter Boughton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接