我正在尝试使用正确的<cfscript>
语法来调用ColdFusion 9中的动态方法。我已经尝试了很多变体并进行了很好的搜索。
<cfinvoke>
显然是我想要的标签,遗憾的是,我不能在我的纯cfscript
组件中使用它,因为它是在ColdFusion 10中实现的。
即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%返回正确定义和访问该方法的正确值(方法名称),
我的错误是该行的语法错误。
答案 0 :(得分: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();
答案 1 :(得分:0)
假设该方法在您当前的(变量)范围内,您可以尝试:
var result = variables[reflectionMethod.getMethodName()](argumentCollection = params);