ColdFusion 9动态方法调用

时间:2012-09-27 23:07:39

标签: coldfusion coldfusion-9 cfc

我正在尝试使用正确的<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%返回正确定义和访问该方法的正确值(方法名称),

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

2 个答案:

答案 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);