5

私は<cfscript>ColdFusion9内で動的メソッドを呼び出すための正しい構文を見つけようとしています。私はいくつかのバリエーションを試し、よく検索しました。

<cfinvoke>cfscriptは明らかに私が望むタグですが、残念ながら、ColdFusion 10で実装されているため、純粋なコンポーネント内でこれを使用することはできません。

つまり、coldfusion9は動的にメソッドを呼び出します

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 インスタンスではなく、呼び出しコードのコンテキストで実行されることです。メソッドのコードによっては、これが問題になる場合と問題にならない場合があります。

もう 1 つの方法は、静的に名前が付けられたメソッドをオブジェクトに注入することです。次に例を示します。

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 に答える