6

古いサイトを CF 10 に変換しており、ヘルパー コードの一部を前に出したいと考えていました。

コードはクエリを見て、インスタンスにあるものを見つけて、それらを設定します。

<cffunction name="populateSelf">
    <cfargument name="source" type="query" required="yes" />
    <cfif arguments.source.recordcount EQ 1>
        <cfloop list="#arguments.source.columnlist#" index="local.col">
            <cfif structKeyExists(variables.instance, local.col)>
                <cfset variables.instance[local.col] = arguments.source[local.col]) />
            </cfif>
        </cfloop>
    </cfif> <!--- one record? --->
</cffunction>

「getMetaData()」を使用して、現在のプロパティの便利な評価に置き換えましたstructKeyExists(variables.instance, local.col)が、次の行で問題が発生しています。<cfset variables.instance[local.col] = arguments.source[local.col]) />

に変更すると<cfset this[local.col] =arguments.source[local.col] />、暗黙的なセッターが無視され、結果が this スコープに入れられます...

セッターを呼び出すために、次のコードを試しました。

<cfset setValue =arguments.source[local.col] />
<cfset evaluate("set#local.col#('#setValue#')" />

しかし、これは複雑でエラーが発生しやすいようです (文字列内の "'" もエスケープする必要があります)。

this.setPROPERTYNAME(query.COLUMN)おそらく数十回明示的に呼び出すことなく、クエリを使用して CFC プロパティの一部またはすべてをロードする最良の方法は何ですか????

4

2 に答える 2

7

したがって、これをすべて正しく読んでいる場合、あなたの質問は実際には「メソッドを動的に呼び出すにはどうすればよいですか?」であり、残りはすべて設定されたドレッシングですか?

文字列を使用して動的変数名を設定し、それへの関数参照を設定してから、参照を介して関数を呼び出すことができます。

myMethodName = "set#local.col#";
myMethodReference = this[myMethodName];
myMethodReference(arguments.source[local.col]);
于 2013-01-01T10:32:20.790 に答える
6

メソッドを動的に呼び出したい場合は、 cfinvoke を使用できます

<cfinvoke method="set#property#">

わかる?

于 2013-01-01T10:31:18.380 に答える